POJ 2965 The Pilots Brothers' refrigerator

解题思路:

  将(i,j)位置‘+’变为‘-’,我们仅需分别更新其对应的行和列(该位置所在的行和列均被更新4次,其本身更新7次,其余位置均被更新2次,更新偶数次的位置不会导致状态的改变)。所以当某个位置出现‘+’的时候,我们需要更新对应行和列,因此可以将对应位置需要更新的次数分别+1。我们可以发现,更新的次序对结果无影响,如果某个位置被连续更新两次,结果又回到初始状态。因此在统计结束后,我们仅需更新统计次数为奇数位置的点。

int main()
{
	unsigned short a[] = {4383, 8751, 17487, 34959, 4593, 8946, 17652, 35064, 7953, 12066, 20292, 36744, 61713, 61986, 62532, 63624};
	unsigned short b[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768};

	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] == '+')
					sum ^= a[i*4+j];

		int t = 1,s = sum;
		while (s=s&(s-1))t++;
		printf("%d\n", t);

		for (int i = 0; i < 4; i++)
			for (int j = 0; j < 4; j++)
				if (sum&(b[i * 4 + j]))printf("%d %d\n",i+1,j+1);
	}

	return 0;
}

posted on 2010-10-27 13:42  ltang  阅读(148)  评论(0)    收藏  举报

导航