poj 1568 Find the Winning Move 极大极小搜索
思路:用极大极小搜索解决这样的问题很方便!!
代码如下:
1 #include <cstdio> 2 #include <algorithm> 3 #define inf 100000000 4 using namespace std; 5 char str[4][5]; 6 int x,y,num; 7 bool ok(int x,int y) //判断是否胜 8 { 9 int i; 10 for(i=0;i<4;i++) //(x,y)所在的行 11 if(str[x][i]!=str[x][y]) break; 12 if(i==4) return 1; 13 for(i=0;i<4;i++) //(x,y)所在的列 14 if(str[i][y]!=str[x][y]) break; 15 if(i==4) return 1; 16 if(x==y){ //主对角线 17 for(i=0;i<4;i++) 18 if(str[i][i]!=str[x][y]) break; 19 if(i==4) return 1; 20 return 0; 21 } 22 if(x+y==3){ //副对角线 23 for(i=0;i<4;i++) 24 if(str[i][3-i]!=str[x][y]) break; 25 if(i==4) return 1; 26 return 0; 27 } 28 return 0; 29 } 30 int minimax(int x,int y,int ma); 31 int maxmini(int x,int y,int mi) 32 { 33 int ma=-inf; 34 if(ok(x,y)) return ma; 35 if(num==16) return 0; 36 for(int i=0;i<4;i++) 37 for(int j=0;j<4;j++) 38 if(str[i][j]=='.'){ 39 str[i][j]='x'; 40 num++; 41 int t=minimax(i,j,ma); 42 num--; 43 str[i][j]='.'; 44 ma=max(ma,t); 45 if(ma>=mi) return ma; 46 } 47 return ma; 48 } 49 int minimax(int x,int y,int ma) 50 { 51 int mi=inf; 52 if(ok(x,y)) return mi; 53 if(num==16) return 0; 54 for(int i=0;i<4;i++) 55 for(int j=0;j<4;j++) 56 if(str[i][j]=='.'){ 57 str[i][j]='o'; 58 num++; 59 int t=maxmini(i,j,mi); 60 num--; 61 str[i][j]='.'; 62 mi=min(mi,t); 63 if(mi<=ma) return mi; 64 } 65 return mi; 66 } 67 bool cal() 68 { 69 int ma=-inf; 70 for(int i = 0;i<4;i++) 71 for(int j = 0;j<4;j++) 72 if(str[i][j]=='.'){ 73 str[i][j]='x'; 74 num++; 75 int t = minimax(i,j,ma); 76 num--; 77 str[i][j]='.'; 78 ma=max(t,ma); 79 if(ma==inf){ 80 x=i; 81 y=j; 82 return 1; 83 } 84 } 85 return 0; 86 } 87 int main() 88 { 89 char ch[4]; 90 // freopen("1.txt","r",stdin); 91 while(scanf("%s",ch)&&ch[0]!='$'){ 92 num = 0; 93 for(int i = 0;i < 4;i++){ 94 scanf("%s",str[i]); 95 for(int j = 0;j < 4;j++) 96 num += (str[i][j]!='.'); 97 } 98 if(num <= 4){ 99 printf("#####\n"); 100 continue; 101 } 102 if(cal()) printf("(%d,%d)\n",x,y); 103 else printf("#####\n"); 104 } 105 }