思路:用极大极小搜索解决这样的问题很方便!!

代码如下:

 #include <cstdio>
#include <algorithm>
#define inf 100000000
using namespace std;
char str[][];
int x,y,num;
bool ok(int x,int y) //判断是否胜
{
int i;
for(i=;i<;i++) //(x,y)所在的行
if(str[x][i]!=str[x][y]) break;
if(i==) return ;
for(i=;i<;i++) //(x,y)所在的列
if(str[i][y]!=str[x][y]) break;
if(i==) return ;
if(x==y){ //主对角线
for(i=;i<;i++)
if(str[i][i]!=str[x][y]) break;
if(i==) return ;
return ;
}
if(x+y==){ //副对角线
for(i=;i<;i++)
if(str[i][-i]!=str[x][y]) break;
if(i==) return ;
return ;
}
return ;
}
int minimax(int x,int y,int ma);
int maxmini(int x,int y,int mi)
{
int ma=-inf;
if(ok(x,y)) return ma;
if(num==) return ;
for(int i=;i<;i++)
for(int j=;j<;j++)
if(str[i][j]=='.'){
str[i][j]='x';
num++;
int t=minimax(i,j,ma);
num--;
str[i][j]='.';
ma=max(ma,t);
if(ma>=mi) return ma;
}
return ma;
}
int minimax(int x,int y,int ma)
{
int mi=inf;
if(ok(x,y)) return mi;
if(num==) return ;
for(int i=;i<;i++)
for(int j=;j<;j++)
if(str[i][j]=='.'){
str[i][j]='o';
num++;
int t=maxmini(i,j,mi);
num--;
str[i][j]='.';
mi=min(mi,t);
if(mi<=ma) return mi;
}
return mi;
}
bool cal()
{
int ma=-inf;
for(int i = ;i<;i++)
for(int j = ;j<;j++)
if(str[i][j]=='.'){
str[i][j]='x';
num++;
int t = minimax(i,j,ma);
num--;
str[i][j]='.';
ma=max(t,ma);
if(ma==inf){
x=i;
y=j;
return ;
}
}
return ;
}
int main()
{
char ch[];
// freopen("1.txt","r",stdin);
while(scanf("%s",ch)&&ch[]!='$'){
num = ;
for(int i = ;i < ;i++){
scanf("%s",str[i]);
for(int j = ;j < ;j++)
num += (str[i][j]!='.');
}
if(num <= ){
printf("#####\n");
continue;
}
if(cal()) printf("(%d,%d)\n",x,y);
else printf("#####\n");
}
}
04-17 04:21