问题描述
试题编号: | 201803-4 |
试题名称: | 棋局评估 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 Alice和Bob正在玩井字棋游戏。 输入格式 输入的第一行包含一个正整数T,表示数据的组数。 输出格式 对于每组数据,输出一行一个整数,表示当前局面的得分。 样例输入 3 样例输出 3 样例说明 第一组数据: 数据规模和约定 对于所有评测用例,1 ≤ T ≤ 5。 |
#include<bits/stdc++.h>
using namespace std;
int T;
int ans[4][4];
bool hline(int h,int f){
return ans[h][0]==f&&ans[h][0]==ans[h][1]&&ans[h][0]==ans[h][2];
}
bool lline(int l,int f){
return ans[0][l]==f&&ans[0][l]==ans[1][l]&&ans[0][l]==ans[2][l];
}
int space(){
int num=0;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++)
if(!ans[i][j]) num++;
}
return num;
}
int win(int f){
int w=0,res=1;
if(hline(0,f)||hline(1,f)||hline(2,f)) w=1;
if(lline(0,f)||lline(1,f)||lline(2,f)) w=1;
if(ans[0][0]==f&&ans[0][0]==ans[1][1]&&ans[0][0]==ans[2][2]) w=1;
if(ans[0][2]==f&&ans[0][2]==ans[1][1]&&ans[0][2]==ans[2][0]) w=1;
if(!w) return 0;
res+=space();
return (f==1)?res:-res;
}
int DFS(int p){
if(!space()) return 0;
int mmax=-10,mmin=10;
for(int i=0;i<3;++i){
for(int j=0,w;j<3;++j){//枚举可以落棋的位置
if(!ans[i][j]){
ans[i][j]=p+1;
w=win(p+1);
if(w){
ans[i][j]=0;
return w>0?max(mmax,w):min(mmin,w);
}
if(!p) mmax=max(mmax,DFS(1));
else mmin=min(mmin,DFS(0));
ans[i][j]=0;
}
}
}
return p?mmin:mmax;
}
int main(){
cin>>T;
while(T--){
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
cin>>ans[i][j];
}
}
int x=win(1),y=win(2);
if(x){
cout<<x<<endl;
continue;
}
if(y){
cout<<y<<endl;
continue;
}
cout<<DFS(0)<<endl;
}
return 0;
}