博弈搜索 ccf 棋局评估
感悟
博弈搜索的关键在于给定一个棋局,搜索每种可能,这时如果这个棋是A下的,那么下来由B搜索(假定A期望值变大,B期望值变小),那么应该返回所有情况里搜索值最小的(A,B都是能博弈搜索到当下情况发生后的所有情况,那么在给定情况下一定会做对自己最有利的选择(也即所有博弈情况中对自己最好的一种情况));
#include<cstdio>
#include<map>
#include<vector>
#include<math.h>
#include<iostream>
#include<set>
#include<queue>
#include<sstream>
#include<list>
#include<algorithm>
#include<stack>
using namespace std;
int a[3][3];
bool check(){
bool flag=false;
for(int i=0;i<3;i++){
if(a[i][0]==a[i][1]&&a[i][1]==a[i][2]&&a[i][0]) flag=true;
else if(a[0][i]==a[1][i]&&a[1][i]==a[2][i]&&a[0][i]) flag=true;
if(flag) break;
}
if(!flag){
if(a[0][0]==a[1][1]&&a[1][1]==a[2][2]&&a[1][1]) flag=true;
else if(a[0][2]==a[1][1]&&a[1][1]==a[2][0]&&a[1][1]) flag=true;
}
return flag;
}
int dfs(int i,int j,bool enemy){
int minn=10,maxn=-10;
a[i][j]=enemy?2:1;
if(check()){
int count=0;
for(int k=0;k<9;k++) if(!a[k/3][k%3]) count++;
a[i][j]=0;
return (!enemy)?count+1:-(count+1);
}
else{
bool flag=false;
int result=0;
for(int m=0;m<3;m++){
for(int n=0;n<3;n++){
if(a[m][n]==0){
flag=true;
result=dfs(m,n,!enemy);
minn=min(result,minn);
maxn=max(maxn,result);
}
}
}
a[i][j]=0;
if(!flag) return 0;
else return enemy?maxn:minn;
}
}
int main(){
int times;
cin>>times;
for(int i=0;i<times;i++){
for(int j=0;j<9;j++){
cin>>a[j/3][j%3];
}
if(check()){
int count=0;
for(int k=0;k<9;k++) if(!a[k/3][k%3]) count++;
cout<<-(count+1)<<endl;
}
else{
bool flag=false;
int maxn=-10;
for(int j=0;j<9;j++){
if(!a[j/3][j%3]){
maxn=max(maxn,dfs(j/3,j%3,false));
flag=true;
}
}
if(!flag) cout<<0<<endl;
else cout<<maxn<<endl;
}
}
}