The Pilots Brothers' refrigerator--POJ 2965
1、题目类型:BFS,位运算。
2、解题思路:(1)将输入转换为int 16位整数;(2)BFS,中止条件为data==0;(3)输出BFS层数,并记录每层改变的位置。
3、注意事项:BFS中用STL的queue做队列,提交TLE。
4、实现方法:
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
struct Node{
int data,step,state;
};
Node Q[100000];
int cnt,c,val;
bool flag[65536];
int Arr[16]={0xf888,0xf444,0xf222,0xf111,
0x8f88,0x4f44,0x2f22,0x1f11,
0x88f8,0x44f4,0x22f2,0x11f1,
0x888f,0x444f,0x222f,0x111f};
int main()
{
char ch;
val=0;
for(int i=0;i<16;i++)
{
cin>>ch;
if(ch=='+')
val+=pow(2.0,16-i-1);
}
Node tmp,t;
tmp.data=val;
tmp.step=0;
tmp.state=0;
Q[cnt++%100000]=tmp;
flag[val]=true;
while(1)
{
tmp=Q[c++%100000];
for(int i=0;i<16;i++)
{
t.data=tmp.data^Arr[i];
t.step=tmp.step+1;
if(!flag[t.data])
{
t.state=tmp.state|(1<<i);
if(t.data==0)
{
cout<<t.step<<endl;
for(int j=0;j<16;j++)
{
if(t.state&1<<j)
cout<<j/4+1<<" "<<j%4+1<<endl;
}
return 1;
}
Q[cnt++%100000]=t;
flag[t.data]=true;
}
}
}
return 0;
}