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 }
View Code

 

 

 

posted @ 2013-09-20 12:02  _随心所欲_  阅读(298)  评论(0编辑  收藏  举报