POJ 1753 Flip Game
解题思路,枚举16种情况,BFS, 压缩
code:
#include <iostream>
using namespace std;
int a[]={19,39,78,140,305,626,1252,2248,4880,10016,20032,35968,12544,29184,58368,51200};
const int size = 65535;
int BFS(int num)
{
if (num == 0 || num == size)
return 0;
bool visit[size];
memset(visit, 0, sizeof(bool) * size);
int depth[size], stack[size], begin = 0, end = 0, u, v;
visit[num] = true;
depth[num] = 0;
stack[end++] = num;
while (begin < end)
{
u = stack[begin++];
for (int i = 0; i < 16; i++)
{
v = u ^ a[i];
if (!visit[v])
{
if (v == 0 || v == size)
return depth[u] + 1;
visit[v] = true;
depth[v] = depth[u] + 1;
stack[end++] = v;
}
}
}
return -1;
}
int main()
{
char ch[4][5];
while (scanf("%s", ch[0]) != EOF)
{
int sum = 0;
for (int i = 1; i < 4; i++)
scanf("%s", ch[i]);
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
if (ch[i][j] == 'b')
sum ^= (1 << (i * 4 + j));
int d = BFS(sum);
( d== -1) ? printf("Impossible\n") : printf("%d\n", d);
}
return 0;
}
浙公网安备 33010602011771号