对抗搜索。
https://blog.youkuaiyun.com/fsdev/article/details/6849727
感谢这位博主的分享,给了我很大帮助。
主要用到了图里面的公式。下面剪枝我没看呢还。
这次的代码应该不算shi了吧……
虽然也不是很好就是了。
另外这次最后的编译一次通过,小小开心一下……
不过写得很慢,考试肯定来不及……
#include<iostream>
#include<list>
#include<cstring>
using namespace std;
#define Alice 1
#define Bob 2
#define Win 0
#define NotEnd 1
#define Lose 2
#define Equal 3
int checkState(char (&state)[3][3]);
int MaxMinValue(char (&state)[3][3],char player);
int getScore(char (&state)[3][3]);
class point{
public:
char x,y;
point(char x,char y){
this->x=x;
this->y=y;
}
};
// {
// cout<<"In MaxMinValue:"<<endl;
// for(int i=0;i<3;i++){
// for(int j=0;j<3;j++){
// cout<<(int)state[i][j]<<" ";
// }
// }
// cout<<endl;
//}
int main(){
char state[3][3];
int n;
cin>>n;
list<int> result;
for(int k=0,m;k<n;k++){
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
cin>>m;
state[i][j]=m;
}
}
result.push_back(MaxMinValue(state,Alice));
}
// char state[3][3]={1,2,1,2,1,2,0,0,0};
// cout<<MaxMinValue(state,Alice)<<endl;
while(!result.empty()){
cout<<result.front()<<endl;
result.pop_front();
}
// for(int i=0;i<3;i++){
// for(int j=0;j<3;j++){
// cout<<(int)state[i][j]<<" ";
// }
// }
// cout<<endl;
return 0;
}
int MaxMinValue(char (&state)[3][3],char player){
switch(checkState(state)){
case NotEnd:
break;
case Win:
return getScore(state);
case Lose:
return -getScore(state);
case Equal:
return 0;
default:
cout<<"Error! Illegal checkState() result"<<endl;
}
list<point> pointList;
list<int> scoreList;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(state[i][j]==0){
pointList.push_back(point(i,j));
// cout<<"push_back "<<i<<","<<j<<endl;
}
}
}
for(point apoint(0,0);!pointList.empty();){
apoint=pointList.front();
char stateChild[3][3];
memcpy(stateChild,state,sizeof(state));
// for(int i=0;i<3;i++){
// for(int j=0;j<3;j++){
// cout<<(int)stateChild[i][j]<<" ";
// }
// }
stateChild[apoint.x][apoint.y]=player;
pointList.pop_front();
scoreList.push_back(MaxMinValue(stateChild,player==Alice?Bob:Alice));
}
scoreList.sort();
return player==Alice?scoreList.back():scoreList.front();
// cout<<"ok"<<endl;
}
int checkState(char (&state)[3][3]){
// cout<<"checkState..."<<endl;
for(int i=0;i<3;i++){
if(state[i][0]==state[i][1]&&
state[i][1]==state[i][2]){
if(state[i][0]==Alice){
return Win;
}else if(state[i][0]==Bob){
return Lose;
}
}
}
for(int i=0;i<3;i++){
if(state[0][i]==state[1][i]&&
state[1][i]==state[2][i]){
if(state[0][i]==Alice){
return Win;
}else if(state[0][i]==Bob){
return Lose;
}
}
}
if((state[0][0]==state[1][1]&&
state[1][1]==state[2][2])||
(state[0][2]==state[1][1]&&
state[1][1]==state[2][0])){
if(state[1][1]==Alice){
return Win;
}else if(state[1][1]==Bob){
return Lose;
}
}
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(state[i][j]==0){
return NotEnd;
}
}
}
return Equal;
}
int getScore(char (&state)[3][3]) {
// cout<<"getScore..."<<endl;
int counter=1;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(state[i][j]==0){
counter++;
}
}
}
return counter;
}