Flip Game(枚举)

POJ 1753 题解:位运算+队列
本文详细解析了POJ 1753题目的解决方案,采用位运算结合队列的方法进行状态转换与搜索,通过具体代码示例与测试数据验证算法的有效性。

~题目链接~

http://poj.org/problem?id=1753

可参考大神题解(位运算):http://www.cnblogs.com/tanhehe/archive/2013/06/11/3131615.html

                                    http://www.cnblogs.com/kuangbin/archive/2011/07/30/2121677.html

                                    http://poj.org/showmessage?message_id=340320

输入

bwwb
bbwb
bwwb
bwww

结果

4

 位运算+队列

  知识点:

  ^ 异或,1^1=0,1^0=1

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 65535+10
#include<queue>

using namespace std;

int data,vis[maxn];

struct node
{
    int rond,step;
} N;

int sreach()
{
    queue<node>Q;
    N.rond=data;
    N.step=0;
    Q.push(N);
    vis[N.rond]=1;//标记这种形式的已访问
    if(data==0 || data==65535)
        return N.step;
    while(!Q.empty())
    {
        for(int i=0; i<16; i++)//从最后一位开始变换,并记录
        {
            N.rond=Q.front().rond^(1<<i);//此位点翻转
            if(i<12)
                N.rond^=1<<(i+4);//此位点上侧点翻转
            if(i>=4)
                N.rond^=1<<(i-4);//此位点下侧点翻转
            if(i%4!=0)
                N.rond^=1<<(i-1);//此位点左侧点翻转
            if(i%4!=3)
                N.rond^=1<<(i+1);//此位点右侧点翻转
            if(!vis[N.rond])//判断是否被访问过
            {
                N.step=Q.front().step+1;
                Q.push(N);
                vis[N.rond]=1;
            }
            if(N.rond==0 || N.rond==65535)
                return N.step;
        }
        Q.pop();
    }
    return -1;//不能转换
}

int main()
{
    char s;
    for(int i=1; i<=4; i++)
    {
        for(int j=1; j<=4; j++)
        {
            data*=2;
            scanf("%c",&s);
            if(s=='b')
                data+=1;//转换成数据
        }
        getchar();
    }
    int x=sreach();
    if(x==-1)
        printf("Impossible\n");
    else
        printf("%d\n",x);
    return 0;
}

  

  

 附带~测试数据(测试数据过,稳过)

bwbw
wwww
bbwb
bwwb
Impossible
bwwb
bbwb
bwwb
bwww
4
wwww
wwww
wwww
wwww
0
bbbb
bbbb
bbbb
bbbb
0
bbbb
bwbb
bbbb
bbbb
Impossible
bwbb
bwbb
bwbb
bbbb
Impossible
bwbb
wwwb
bwbb
bbbb
1
wwww
wwwb
wwbb
wwwb
1
wwww
wwww
wwwb
wwbb
1
wbwb
bwbw
wbwb
bwbw
Impossible
bbbb
bwwb
bwwb
bbbb
4
bwwb
wbbw
wbbw
bwwb
4
bbww
bbww
wwbb
wwbb
Impossible
bbwb
bbbw
wwbb
wwwb
Impossible
wwwb
wwbw
wbww
wwbw
Impossible
bbbb
wwww
wwbb
wbbb
Impossible
bwwb
wbwb
wbbb
wbbb
4
bwbb
bwbb
bwbw
bbbw
5
wbwb
bbbb
bbww
wbbb
6
bbwb
bbbb
wbwb
bbbb
5

  

  

转载于:https://www.cnblogs.com/guoyongzhi/p/3233063.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值