博弈论之前还没学到。。。
不会啊这题
参考了一篇博客:https://blog.csdn.net/xbb224007/article/details/79935167
#include<bits/stdc++.h>
using namespace std;
int mp[3][3];
bool hang(int i,int f){
return mp[i][0]==f&&mp[i][1]==f&&mp[i][2]==f;
}
bool lie(int j,int f){
return mp[0][j]==f&&mp[1][j]==f&&mp[2][j]==f;
}
bool duijiao(int f){
if(mp[0][0]==f&&f==mp[1][1]&&f==mp[2][2]) return 1;
if(mp[0][2]==f&&f==mp[1][1]&&f==mp[2][0]) return 1;
return 0;
}
int spa(){
int res=0;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(!mp[i][j]) res++;
}
}
return res;
}
int win(int f){
bool w=0;
if(hang(0,f)||hang(1,f)||hang(2,f)) w=1;
if(lie(0,f)||lie(1,f)||lie(2,f)) w=1;
if(duijiao(f)) w=1;
if(!w) return 0;
int ans=spa()+1;
return (f==1)?ans:-ans;
}
int dfs(int f){
if(!spa()) return 0;
int Max=-10,Min=10;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(!mp[i][j]){
mp[i][j]=f;
int w=win(f);
if(w){
mp[i][j]=0;
return w>0?max(Max,w):min(Min,w);
}
if(f==1){
Max=max(Max,dfs(2));
}else Min=min(Min,dfs(1));
mp[i][j]=0;
}
}
}
return f==1?Max:Min;
}
int main(){
int n;
scanf("%d",&n);
while(n--){
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
scanf("%d",&mp[i][j]);
}
}
if(win(1)){
cout<<win(1)<<endl;
continue;
}
if(win(2)){
cout<<win(2)<<endl;
continue;
}
cout<<dfs(1)<<endl;
}
return 0;
}