1. 程式人生 > >ccf-棋局評估-20190304

ccf-棋局評估-20190304

i++ else 核心 end code 時間 clas lag pla

三更: 更短的代碼,更短的時間,加油! 也祝你好運哦!!!!

核心: dfs(player) player下完之後最大得分

優點: 我位運算掌握的還不錯嘛 2和1如何轉換 2^3=1; 1^3=2; hh!

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int inf = 0x3f3f3f3f;
 4 const int n = 3;
 5 int mp[5][5];
 6 int num;
 7 int judge () {
 8   int flag = 0;
 9   //
if (num==9) return 0; // 平局 放在這裏會錯誤 10 for (int i = 1; i <= n && !flag; i++) { 11 if (mp[i][1] && mp[i][1] == mp[i][2] && mp[i][2] == mp[i][3]) flag = mp[i][1] ; 12 if (mp[1][i] && mp[1][i] == mp[2][i] && mp[2][i] == mp[3][i]) flag = mp[1][i] ;
13 } 14 if (mp[1][1] && mp[1][1] == mp[2][2] && mp[2][2] == mp[3][3]) flag = mp[1][1]; 15 if (mp[1][3] && mp[1][3] == mp[2][2] && mp[2][2] == mp[3][1]) flag = mp[1][3]; 16 if (flag) return 9 - num + 1; 17 if (num==9) return 0; // 平局 18 else return
-1; // 無勝負 19 } 20 int dfs (int p1) { // 選手p先手獲得的最大分 21 int x = judge(); 22 if (x >= 0) return -x; 23 x = inf; int p2 = (p1 ^ 3); 24 for (int i = 1; i <= n; i++) 25 for (int j = 1; j <= n; j++) { 26 if (!mp[i][j]) { 27 mp[i][j] = p1; num++; 28 x = min (x, dfs(p2)); 29 mp[i][j] = 0; num--; 30 } 31 } 32 return -x; 33 } 34 int main () 35 { 36 int T; cin >> T; 37 while (T--) { 38 num = 0; 39 for (int i = 1; i <= n; i++) 40 for (int j = 1; j <= n; j++) { 41 cin >> mp[i][j]; 42 if (mp[i][j]) num++; 43 } 44 int ans = dfs (1); 45 cout << ans << endl; 46 } 47 return 0; 48 }

ccf-棋局評估-20190304