POJ:Flip Game

题目来源:http://poj.org/problem?id=1753

题目类型:枚举 + BFS + 位运算

主要思想:由于硬币只有两种状态,所以可以用16个二进制位来存储16个硬币(unsigned short stat;)

                    异或运算:XOR     0^1=1     1^1=0;  用XOR来快速的flip硬币

    定义flip[16]数组,flip第i个硬币时,用stat与flip[i]异或运算即可

    这里BFS我们用queue实现,每flip一个硬币,就对当前状态入队列,并判断当前状态是否符合题意 即if(stat == 0x0000 || stat == 0xffff)

    下次循环就从queue中pop元素,循环十六次flip,依次判断是否符合题目

核心代码:

for (i = 0;i < SIZE*SIZE; ++i) 
	{
		cin>>c;
		c == 'b'?(stat<<=1)++:stat<<=1;  //注意这里的移位操作
	}

while (!myqueue.empty())
	{
		stat=myqueue.front();
		myqueue.pop();
		for (i=0;i<SIZE*SIZE;++i)
		{
			nextstat=stat^flip[i];
			if(flag[nextstat]==true)
				continue;
			flag[nextstat]=true;
			step[nextstat]=step[stat]+1;
			if(nextstat == 0x0000 || nextstat == 0xffff)
			{
				cout<<step[nextstat]<<endl;
				return 0;
			}
			myqueue.push(nextstat);
		}
	}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值