# 演算法課程題解 - 暴力與窮舉 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 演算法 題解`