1. 程式人生 > >POJ 1568 Find the Winning Move

POJ 1568 Find the Winning Move

blank ble tdi ref return print bsp sca 在哪裏

Find the Winning Move

鏈接

題意:

4*4的棋盤,給出一個初始局面,問先手有沒有必勝策略?

  有的話輸出第一步下在哪裏,如果有多個,按(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1) ... 的順序輸出第一個。沒有輸出“#####”。

分析:

  極大極小搜索,對抗搜索,α+β剪枝。

代碼:

 1 #include<cstdio>
 2 
 3 char g[5][5];
 4 int ansx,ansy;
 5 
 6
int judge() { 7 int za = 0,zb = 0; // 主對角線 8 int fa = 0,fb = 0; // 副對角線 9 for (int i=1; i<=4; ++i) { 10 if (g[i][i] == x) za++; 11 else if (g[i][i]==o) zb++; 12 if (g[i][5-i] == x) fa++; 13 else if (g[i][5-i]==o) fb++; 14 } 15 if (za==4
|| fa==4) return 1; 16 if (zb==4 || fb==4) return -1; 17 18 for (int i=1; i<=4; ++i) { 19 int ra = 0,rb = 0; // 20 int ca = 0,cb = 0; // 21 for (int j=1; j<=4; ++j) { 22 if (g[i][j] == x) ra++; 23 else if (g[i][j] == o) rb++;
24 if (g[j][i] == x) ca++; 25 else if (g[j][i] == o) cb++; 26 } 27 if (ra == 4 || ca == 4) return 1; 28 if (rb == 4 || cb == 4) return -1; 29 } 30 31 return 0; 32 } 33 int Minimax(int player,int alpha,int beta) { 34 int res= judge(); 35 if (res) return res; 36 if (player) { 37 for (int i=1; i<=4; ++i) 38 for (int j=1; j<=4; ++j) 39 if (g[i][j] == .) { 40 g[i][j] = x; 41 res = Minimax(player^1,alpha,beta); 42 g[i][j] = .; 43 if (res > alpha) alpha = res,ansx = i,ansy = j; 44 if (alpha >= beta) return alpha; 45 } 46 return alpha; //- 47 } 48 else { 49 for (int i=1; i<=4; ++i) 50 for (int j=1; j<=4; ++j) 51 if (g[i][j] == .) { 52 g[i][j] = o; 53 res = Minimax(player^1,alpha,beta); 54 g[i][j] = .; 55 if (res < beta) beta = res; 56 if (alpha >= beta) return beta; 57 } 58 return beta; //- 59 } 60 } 61 62 int main() { 63 char op[5]; 64 while (scanf("%s",op) && op[0]!=$) { 65 int cnt = 0; 66 for (int i=1; i<=4; ++i) { 67 scanf("%s",g[i]+1); 68 for (int j=1; j<=4; ++j) 69 if (g[i][j] != .) cnt++; 70 } 71 if (cnt <= 4) { 72 puts("#####");continue; 73 } 74 int ans = Minimax(1,-1,1); 75 if (ans > 0) printf("(%d,%d)\n",ansx-1,ansy-1); 76 else puts("#####"); 77 } 78 return 0; 79 }

POJ 1568 Find the Winning Move