博弈树
极大极小值搜索算法
#include<bits/stdc++.h>
using namespace std;
int mp[3][3];
bool isv(int k)
{
for(int i=0;i<3;i++)
{
if(mp[i][0]==k&&mp[i][1]==k&&mp[i][2]==k) return true;
if(mp[0][i]==k&&mp[1][i]==k&&mp[2][i]==k) return true;
}
if(mp[0][0]==k&&mp[1][1]==k&&mp[2][2]==k) return true;
if(mp[0][2]==k&&mp[1][1]==k&&mp[2][0]==k) return true;
return false;
}
int dfs(int k) //轮到k下棋
{
int t=0;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(mp[i][j]==0) t++;
if(k==1&&isv(2)) return -t-1;
if(k==2&&isv(1)) return t+1;
if(t==0) return 0;
int mn=0x3f3f3f3f,mx=-0x3f3f3f3f;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
{
if(mp[i][j]==0)
{
mp[i][j]=k;
if(k==1) mx=max(mx,dfs(2));
if(k==2) mn=min(mn,dfs(1));
mp[i][j]=0;
}
}
if(k==1) return mx;
if(k==2) return mn;
}
int main()
{
int T;
cin>>T;
while(T--)
{
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
cin>>mp[i][j];
cout<<dfs(1)<<endl;
}
return 0;
}