# 演算法課程題解 - 暴力與窮舉 3
# TOJ 460
## 題目
https://toj.tfcis.org/oj/pro/460/
## 解法 By Koios1143
### 想法
將整個遊戲過程模擬一遍,就可以得到答案了。
我自己在解的過程當中一直沒讀懂題目的意思,一直以為我們攻擊的時候會依照 上、左、右、下 的順序攻擊,然後只要攻擊成功就結束後面的攻擊
不過實際上沒有方向的限制,也沒有攻擊次數的限制,所以直接檢查能不能打贏就好。
後面放棋子的流程大概是:
1. 先找到棋子要放哪裡
2. 配置攻擊力
3. 嘗試攻擊四周敵方的棋子
我為了方便接下來的攻擊,所以分別將 上、左、右、下 記成 0、1、2、3
如此當我的方向是 $i$ 時,就檢查對方的方向 $3-i$ 即可
### AC Code
```cpp=
// By Koios1143
#include<iostream>
using namespace std;
int atk[3][3][4], team[3][3];
int dx[] = {-1, 0, 0, 1};
int dy[] = {0, -1, 1, 0};
string s;
char board[3][3];
int HexToDec(char n){
if(n >= '0' && n <= '9')
return n-'0';
else
return 10+(n-'A');
}
int main(){
for(int i=0 ; i<3 ; i++){
for(int j=0 ; j<3 ; j++){
cin>>board[i][j];
}
}
for(int i=0, player=0, x, y ; i<9 ; i++, player=(player+1)%2){
for(int j=0 ; j<9 ; j++){
if(board[j/3][j%3]-'0' == i){
x = j/3;
y = j%3;
break;
}
}
team[x][y] = player;
cin>>s;
for(int j=0 ; j<4 ; j++){
atk[x][y][j] = HexToDec(s[j]);
}
for(int dir=0 ; dir<4 ; dir++){
int nx = x + dx[dir];
int ny = y + dy[dir];
int ndir = 3-dir;
if(nx < 0 || nx >= 3 || ny < 0 || ny >= 3 || board[nx][ny] > board[x][y] || team[nx][ny] == player)
continue;
if(atk[x][y][dir] >= atk[nx][ny][ndir]){
team[nx][ny] = player;
}
}
}
int P1=0, P2=0;
for(int i=0 ; i<3 ; i++){
for(int j=0 ; j<3 ; j++){
if(team[i][j] == 0)
P1++;
else
P2++;
}
}
cout<<P1<<"-"<<P2<<"\n";
return 0;
}
```
# UVa 10142
## 題目
http://domen111.github.io/UVa-Easy-Viewer/?10142
# UVa 10443
## 題目
http://domen111.github.io/UVa-Easy-Viewer/?10443
# UVa 11360
## 題目
http://domen111.github.io/UVa-Easy-Viewer/?11360
# UVa 626
## 題目
http://domen111.github.io/UVa-Easy-Viewer/?626
# UVa 640
## 題目
http://domen111.github.io/UVa-Easy-Viewer/?640
# UVa 10622
## 題目
http://domen111.github.io/UVa-Easy-Viewer/?10622
# UVa 11236
## 題目
http://domen111.github.io/UVa-Easy-Viewer/?11236
# UVa 592
## 題目
http://domen111.github.io/UVa-Easy-Viewer/?592
###### tags: `SCIST 演算法 題解`