#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int ma[5][5];
int cha()
{
int ans=0;
for(int i=1; i<=3; i++)
{
for(int j=1; j<=3; j++)
{
if(ma[i][j]==0)ans++;
}
}
return ans;
}
int solve()
{
int ans=0;
for(int i=1; i<=3; i++)
{
for(int j=1; j<=3; j++)
{
if(ma[i][j]==0)ans++;
}
}
for(int i=1; i<=3; i++)
{
if(ma[i][1]==1&&ma[i][2]==1&&ma[i][3]==1)
{
return 1;
}
}
for(int i=1; i<=3; i++)
{
if(ma[1][i]==1&&ma[2][i]==1&&ma[3][i]==1)
{
return 1;
}
}
if(ma[1][1]==1&&ma[2][2]==1&&ma[3][3]==1)
{
return 1;
}
if(ma[1][3]==1&&ma[2][2]==1&&ma[3][1]==1)
{
return 1;
}
for(int i=1; i<=3; i++)
{
if(ma[i][1]==2&&ma[i][2]==2&&ma[i][3]==2)
{
return -1;
}
}
for(int i=1; i<=3; i++)
{
if(ma[1][i]==2&&ma[2][i]==2&&ma[3][i]==2)
{
return -1;
}
}
if(ma[1][1]==2&&ma[2][2]==2&&ma[3][3]==2)
{
return -1;
}
if(ma[1][3]==2&&ma[2][2]==2&&ma[3][1]==2)
{
return -1;
}
if(ans==0)return 0;
return -2;
}
int maxmin(int player,int alpha,int beta)
{
//cout<<"+++"<<endl;
if(solve()==0)
{
return 0;
}
if(solve()==1)
{
return (cha()+1);
}
if(solve()==-1)
{
return 0-(cha()+1);
}
if(player)
{
int val;
for(int i=1; i<=3; i++)
{
for(int j=1; j<=3; j++)
{
if(ma[i][j]==0)
{
ma[i][j]=1;
val=maxmin(0,alpha,beta);
ma[i][j]=0;
if(val>alpha)
{
alpha=val;
}
if(alpha>=beta)
{
return alpha;
}
}
}
}
return alpha;
}
else
{
int val;
for(int i=1; i<=3; i++)
{
for(int j=1; j<=3; j++)
{
if(ma[i][j]==0)
{
ma[i][j]=2;
val=maxmin(1,alpha,beta);
ma[i][j]=0;
if(val<beta)
{
beta=val;
}
if(alpha>=beta)
{
return beta;
}
}
}
}
return beta;
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
for(int i=1; i<=3; i++)
{
for(int j=1; j<=3; j++)
cin>>ma[i][j];
}
int alpha=-100;
int beta=100;
int ans=maxmin(1,alpha,beta);
cout<<ans<<endl;
}
}
ccf 棋盘评估(极大极小值搜索+alpha beta剪枝)
最新推荐文章于 2022-11-27 15:21:45 发布