Flip Game--POJ 1753

1、题目类型:BFS,位运算。

2、解题思路:(1)将输入转换为int 16位整数;(2)BFS,中止条件为data==0 || data==65535;(3)输出BFS层数。

3、注意事项:类似POJ 2965。

4、实现方法:

#include<iostream>
#include
<queue>
#include
<cmath>
using namespace std;

struct Node
{
int data;
int step;
};

int Arr[16]={0xc800,0xe400,0x7200,0x3100,
0x8c80,0x4e40,0x2720,0x1310,
0x08c8,0x04e4,0x0272,0x0131,
0x008c,0x004e,0x0027,0x0013};
int val;
queue
<Node> Q;
bool flag[65536],exist;

void BFS()
{
Node tmp,t;
tmp.data
=val;
tmp.step
=0;
flag[val]
=true;
Q.push(tmp);
if(tmp.data==0||tmp.data==65535)
{
cout
<<0<<endl;
exist
=true;
return ;
}
while(!Q.empty())
{
tmp
=Q.front();
Q.pop();
for(int i=0;i<16;i++)
{
t.data
=tmp.data^Arr[i];
if(t.data==0||t.data==65535)
{
cout
<<tmp.step+1<<endl;
exist
=true;
return ;
}
if(!flag[t.data])
{
t.step
=tmp.step+1;
Q.push(t);
flag[t.data]
=true;
}
}
}
}

int main()
{
char ch;
val
=0;
for(int i=0;i<16;i++)
{
cin
>>ch;
if(ch=='w')
val
+=pow(2.0,i);
}
BFS();
if(!exist)
cout
<<"Impossible"<<endl;
return 0;
}

 

posted @ 2010-08-02 21:02  勇泽  阅读(233)  评论(0编辑  收藏  举报