1. 程式人生 > >201803-4 CFF 棋局評估

201803-4 CFF 棋局評估

對抗搜尋。

感謝這位博主的分享,給了我很大幫助。

主要用到了圖裡面的公式。下面剪枝我沒看呢還。

這次的程式碼應該不算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;
}