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

 

你可能感兴趣的:(poj)