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;
}