#include<iostream>
using namespace std;
int num[20] = { 0 }, visit[65540] = { 0 };
struct unit
{
int x;
int step;
}queue[65540];
void innit()//初始化16种情况
{
int i = 0, row = 0, colum = 0;
for (i = 0; i < 16; i++)
{
row = i / 4, colum = i % 4;
num[i] += 1 << (4 * row + colum);
if (row - 1 >= 0)
{
num[i] += 1 << (4 * (row - 1) + colum);
}
if (row + 1 < 4)
{
num[i] += 1 << (4 * (row + 1) + colum);
}
if (colum - 1 >= 0)
{
num[i] += 1 << (4 * row + colum - 1);
}
if (colum + 1 < 4)
{
num[i] += 1 << (4 * row + colum + 1);
}
}
}
void bfs()
{
int front = 0, i = 0,tail = 0;
tail++;
while (front < tail)
{
if (queue[front].x == 0 || queue[front].x == 0xffff)
{
cout << queue[front].step << endl;
return;
}
for (i = 0; i < 16; i++)
{
if (visit[queue[front].x ^ num[i]]) continue;//记忆化剪枝
queue[tail].x = queue[front].x^num[i];
queue[tail].step=queue[front].step+1;
tail++;
visit[queue[front].x^num[i]] = 1;
}
front++;
}
cout << "Impossible" << endl;
}
int main()
{
int i = 0, j = 0;
innit();
char str='\0';
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
cin >> str;
if (str == 'b')
{
queue[0].x += 1 << (4 * i + j);
}
}
getchar();
}
queue[0].step = 0;
bfs();
return 0;
}
poj1753 广搜+位运算
最新推荐文章于 2018-09-07 15:35:41 发布