三更: 更短的代码,更短的时间,加油! 也祝你好运哦!!!!
核心: 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 }
抓住青春的尾巴。。。