poj 1753

本文介绍了一种使用位运算优化的游戏搜索算法实现。通过输入字符矩阵的状态,算法将其转化为整数状态并利用位操作实现棋盘格子的翻转,以此进行游戏状态搜索。文章详细展示了如何使用队列和状态数组记录每一步变化,最终找到从初始状态到达全黑或全白状态所需的最少步骤。

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

#include <iostream>
#include <queue>
using namespace std;
const int ALLBLACK=65535;
const int ALLWHITE=0;
const int MAX=65536;
int convert(char c){
	if('b'==c)
		return 1;
	if('w'==c)
		return 0;
}
/**
   为了提高搜索效率,采用位运算,
   如果想将整数的二进制某一位翻转可采用
   id^=(1<<x)(x代表要翻转的位置)
  */
int flipgame(int statenum,int pos){//转换
	statenum^=(1<<pos);//当前位翻转
	if(pos/4>0)//up
		statenum^=(1<<(pos-4));
	if(pos/4<3)//down
		statenum^=(1<<(pos+4));
	if(pos%4>0)//left
		statenum^=(1<<(pos-1));
	if(pos%4<3)
		statenum^=(1<<(pos+1));
	return statenum;
}
int main(){
	char c;
	int i,statenum=0;
	for(i=0;i<16;i++){//初始化状态
		cin>>c;
		statenum+=(convert(c)<<i);
	}
	if(ALLBLACK==statenum||ALLWHITE==statenum)
	{
		cout<<0<<endl;
		return 0;
	}
	int state[65536];//记录从初始态达到某个状态所需的步数
	memset(state,-1,sizeof(state));
	queue<int> q;
	int nextnum;
       state[statenum]=0;
	q.push(statenum);
	//求解释
	while(!q.empty()){
		statenum=q.front();
		q.pop();
		for(i=0;i<16;i++){
			nextnum=flipgame(statenum,i);
				if(ALLBLACK==nextnum||ALLWHITE==nextnum)
				{
					cout<<state[statenum]+1<<endl;
						return 0;
				}
				if(state[nextnum]==-1){
					state[nextnum]=state[statenum]+1;
					q.push(nextnum);
				}
		}
	}
	cout<<"Impossible"<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值