AcWing 3260. 棋局评估
原题链接
中等
作者:
把这题Ac了
,
2024-12-05 11:55:34
,
所有人可见
,
阅读 1
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 3,INF = 1e8;
int g[N][N],T;
bool check(int u){
for(int i = 0;i < 3;i++){
int s = 0;
for(int j = 0;j < 3;j++){
if(g[i][j] == u) s++; //行
}
if(s == 3) return true;
s = 0;
for(int j = 0;j < 3;j++){
if(g[j][i] == u) s++;//列
}
if(s == 3) return true;
}
if(g[0][0] == u && g[1][1] == u && g[2][2] == u) return true;
if(g[0][2] == u && g[1][1] == u && g[2][0] == u) return true;
return false;
}
int eva(){
int s = 0;
for(int i = 0;i < 3;i++)
for(int j = 0;j < 3;j++)
if(!g[i][j]) s++; // 空白个数
if(check(1)) return 1 + s;
if(check(2)) return -(1 + s);
if(!s) return 0;//平局
return INF;
}
int dfs(int u){
int t = eva();
if(t != INF) return t;
//alice下棋
if(u == 1){
int res = -INF;
for(int i = 0;i < 3;i++){
for(int j = 0;j < 3;j++){
if(!g[i][j]){
g[i][j] = u;
res = max(res,dfs(2));
g[i][j] = 0;
}
}
}
return res;
}else if(u == 2){
int res = INF;
for(int i = 0;i < 3;i++){
for(int j = 0;j < 3;j++){
if(!g[i][j]){
g[i][j] = u;
res = min(res,dfs(1));
g[i][j] = 0;
}
}
}
return res;
}
}
int main(){
cin >> T;
while(T--){
for(int i = 0;i < 3;i++)
for(int j = 0;j < 3;j++)
cin >> g[i][j];
//1是alice 2是bob
cout << dfs(1) << endl;
}
return 0;
}