POJ 1753 Flip Game

本文介绍了一种使用状态压缩结合广度优先搜索解决特定问题的方法,通过将状态表示为16位二进制数并进行操作,实现高效求解路径或状态转换问题。详细阐述了算法的核心思想及实现过程,并指出常见错误如忘记使用等于号可能导致的运行错误。

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

状态压缩+广搜就可以了.

用0表示w,1表示b,16位2进制最大是65535.也就是说全黑或全白的状态是0和65535.

接下来广搜就可以了

一开始大于等于号忘了写等于号导致WA了好几次..囧..

#include <cstdio>
#include <queue>
#include <string.h>
using namespace std;
int vi[65536];
int f(int s,int j){
	//1 xor 0 =1,1 xor 1 = 0 状态改变
	//0 xor 0 =0,0 xor 1 = 1 状态不变 
	s^=(1<<j);
	if(j/4!=0)s^=1<<(j-4);//不是第一行 
	if(j/4!=3)s^=1<<(j+4);//不是最后一行 
	if(j%4!=0)s^=1<<(j-1);//不是第一列 
	if(j%4!=3)s^=1<<(j+1);//不是最后一列 
	return s;
}
int bfs(int x){
	if(x==0||x==65535)return 0;//初始就已达到状态 
	queue<int> qu;
	qu.push(x);
	vi[x]=1;
	int step=0;
	int pos=0,epos=1;
	while(1){
		int s2=epos;
		step++;
		for(int i=pos;i<epos;i++){//遍历这一层 
			int s=qu.front();
			qu.pop();
			for(int j=0;j<16;j++){//16个灯 
				int next=f(s,j);
				if(next==0||next==65535)return step;//达到状态 
				if(vi[next]==0){
					vi[next]=1;
					qu.push(next);
					s2++;
				}
			}	
		}
		if(pos==epos)return -1;//这一层便利中没有加入新状态,不能向下搜索了 
		pos=epos;
		epos=s2;
	}
	return -1;
}
int main(){
	char line[6];
	int st=0,res;
	memset(vi,0,sizeof(vi));
 	for(int i=0;i<4;i++){
	 	scanf("%s",line);
		for(int j=0;j<4;j++){
			if(line[j]=='b')st+=1<<(4*i+j);
		}	
	}
	if((res=bfs(st))>=0)printf("%d\n",res);
	else printf("Impossible\n"); 
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值