201803-4 CFF 棋局评估

本文介绍了一个基于对抗搜索算法的实现,主要用于解决二人博弈问题。该算法通过递归地评估所有可能的游戏状态,来预测最佳走法。代码实现了状态检查、分数获取及最大最小值评估等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对抗搜索。

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值