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

 

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