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

posted on 2010-10-26 15:35  ltang  阅读(156)  评论(0)    收藏  举报

导航