AcWing 3260. 棋局评估(带有详细注释讲解)
原题链接
中等
作者:
未来可期_8
,
2025-03-22 21:39:18
·北京
,
所有人可见
,
阅读 2
#include<iostream>
using namespace std;
const int N = 3, INF = 1e8;
int n;
int g[N][N];
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 evaluate()
{
int blank = 0;
for(int i = 0; i < 3; i ++)
for(int j = 0; j < 3; j ++)
{
if(g[i][j] == 0) blank ++;
}
if(check(1)) return blank + 1;
if(check(2)) return -(blank + 1);
if(blank == 0) return 0;
return INF;
}
int dfs(int u)
{
int t = evaluate();
if(t != INF) return t;
if(u == 0)
{
int res = -INF;
for(int i = 0; i < 3; i ++)
for(int j = 0; j < 3; j ++)
{
if(g[i][j] == 0)
{
g[i][j] = 1;
res = max(res, dfs(1));
g[i][j] = 0;
}
}
return res;
}
else
{
int res = INF;
for(int i = 0; i < 3; i ++)
for(int j = 0; j < 3; j ++)
{
if(g[i][j] == 0)
{
g[i][j] = 2;
res = min(res, dfs(0));
g[i][j] = 0;
}
}
return res;
}
}
int main()
{
scanf("%d", &n);
while(n --)
{
for(int i = 0; i < 3; i ++)
for(int j = 0; j < 3; j ++)
scanf("%d", &g[i][j]);
printf("%d\n", dfs(0));
}
return 0;
}