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

 

 

 

你可能感兴趣的:(find)