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

 

你可能感兴趣的:(game)