#include<iostream>
using namespace std;
#include<cstring>
#define INF 1e7
int g[3][3];
int eval() //如果有一方赢了,返回得分,若游戏尚未结束 返回INF
{
int space=0;
for(int i=0;i<3;i++) //计算空格数量
{
for(int j=0;j<3;j++)
{
if(g[i][j]==0)
space++;
}
}
for(int i=0;i<3;i++) //判断Alice 是否赢了
{
int s=0;
for(int j=0;j<3;j++)
{
if(g[i][j]==1)
s++;
}
if(s==3)
return space+1;
s=0;
for(int j=0;j<3;j++)
{
if(g[j][i]==1)
s++;
}
if(s==3)
return space+1;
}
if(g[0][0]==1 && g[1][1]==1 && g[2][2]==1)
return space+1;
if(g[2][0]==1 && g[1][1]==1 && g[0][2]==1)
return space+1;
for(int i=0;i<3;i++) //判断Bob 是否赢了
{
int s=0;
for(int j=0;j<3;j++)
{
if(g[i][j]==2)
s++;
}
if(s==3)
return -(space+1);
s=0;
for(int j=0;j<3;j++)
{
if(g[j][i]==2)
s++;
}
if(s==3)
return -(space+1);
}
if(g[0][0]==2 && g[1][1]==2 && g[2][2]==2)
return -(space+1);
if(g[2][0]==2 && g[1][1]==2 && g[0][2]==2)
return -(space+1);
if(!space) //都没赢 且空格数为0,说明平局
return 0;
return INF; // 游戏尚未结束
}
int dfs(int x)
{
int tt=eval();
if(tt!=INF) return tt; //dfs终止条件 有人胜出或平局
int res;
if(!x) //Alice 进棋
{
res=-INF;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
if(!g[i][j])
{
g[i][j]=1;
res=max(res,dfs(1)); //取 Bob走的所有情况中得分最大值的路线
g[i][j]=0;
}
}
return res;
}else { //Bob进棋
res=INF;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
if(!g[i][j])
{
g[i][j]=2;
res=min(res,dfs(0));//取 Alice走的所有情况中得分最小值的路线
g[i][j]=0;
}
}
return res;
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
memset(g,0,sizeof(g));
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
scanf("%d",&g[i][j]);
printf("%d\n",dfs(0));
}
return 0;
}
CCF-CSP-201803-4 棋局评估 dfs
最新推荐文章于 2022-05-29 19:28:44 发布