点击前往试题目录:https://blog.csdn.net/best335/article/details/99550556
思想很简单遍历所有的位置找到当前行棋方案的最高分。
#include<iostream>
#include<cstring>
using namespace std;
int C[3][3];
bool isWin(){//判断棋盘C是否有胜者
for(int i=0;i<3;++i)
if(C[i][0]!=0&&C[i][0]==C[i][1]&&C[i][1]==C[i][2]|| //判断行是否满足获胜条件
C[0][i]!=0&&C[0][i]==C[1][i]&&C[1][i]==C[2][i])//判断列是否满足获胜条件
return true;//最后判断对角是否满足获胜条件↓
return C[0][0]!=0&&C[0][0]==C[1][1]&&C[1][1]==C[2][2]||C[2][0]!=0&&C[2][0]==C[1][1]&&C[1][1]==C[0][2];
}
int getWinner(){//判断是谁赢了 返回值 1:Alice获胜 2:Bob获胜 0:没有人获胜
for(int i=0;i<3;++i)
if(C[i][0]!=0&&C[i][0]==C[i][1]&&C[i][1]==C[i][2]) return C[i][0];
else if(C[0][i]!=0&&C[0][i]==C[1][i]&&C[1][i]==C[2][i])return C[0][i];
return C[1][1];
}
int calcScore(bool isWin,int ans=0){//计算棋盘当前得分
for(int i=0;i<3;++i)
for(int j=0;j<3;++j)
if(C[i][j]==0)++ans;
return (isWin?ans+1:ans)*(getWinner()==1?1:-1);
}
int getMaxScoreBob(int ans=0);//为了方便看官更能看明白代码分成两个函数导致代码量增加了13行
int getMaxScoreAlice(int ans=0){//返回在当前棋盘为C时使得Alice得的最大得分
if(isWin()) return calcScore(true);//如果赢了计算得分
if(calcScore(false)!=0) ans=-7;//否则判断是否平局 非平局设置最小值
for(int i=0;i<3;++i)
for(int j=0;j<3;++j)
if(C[i][j]==0){//找到第一个空白位置
C[i][j]=1;//模拟放棋
ans=max(ans,getMaxScoreBob());//取得一个使得Bob得分最大的分数//因为Bob得分是负数
C[i][j]=0;//恢复放棋前的状态
}
return ans;
}
int getMaxScoreBob(int ans){
if(isWin()) return calcScore(true);
if(calcScore(false)!=0) ans=7;
for(int i=0;i<3;++i)
for(int j=0;j<3;++j)
if(C[i][j]==0){
C[i][j]=2;
ans=min(ans,getMaxScoreAlice());//取得一个使得Alice得分最小的分数//因为Alice的分数是正数
C[i][j]=0;
}
return ans;
}
int main(){
int T;
cin>>T;
for(int i=0;i<T;++i){
memset(C,0,sizeof(C));
for(int j=0;j<3;++j)
for(int k=0;k<3;++k)
cin>>C[j][k];//输入
cout<<getMaxScoreAlice()<<endl;//输出
}
return 0;
}