ccf-棋局评估-20190304

三更:  更短的代码,更短的时间,加油! 也祝你好运哦!!!!

核心: 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 }

  

猜你喜欢

转载自www.cnblogs.com/xidian-mao/p/10468552.html