POJ 2965.The Pilots Brothers‘ refrigerator

Posted Alex_996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2965.The Pilots Brothers‘ refrigerator相关的知识,希望对你有一定的参考价值。

POJ 2965.The Pilots Brothers’ refrigerator

Ideas

题意:给你4*4的矩阵。每个点有两种状态,+代表关,-代表开。每个点有一个操作就是该点所在行列所有状态翻转。问最少多少次可以打开全部开关,并且输出最少个数情况下翻转的点。

先梳理一下题目给的测试样例的操作步骤:

首先需要知道一点:一个开关翻转偶数次状态不变,翻转奇数次状态改变。(奇变偶不变)

然后再深入一步:要使一个为+的符号变为-,必须其相应的行和列的操作数为奇数。

如果+位置对应的行和列上每一个位置都进行一次操作,则整个图只有这个+位置的符号改变,其余都不会改变。

假如只有(1, 1)位置上为+,那么第一行和第一列全部翻转一遍之后,只有(1, 1)位置上变为-,其它位置没有改变。

设置一个4*4的整型数组mark,初值为零,用于记录每个位置的操作次数。

那么在每个+上的行和列的的位置都加1,也就是说这个+对应位置的行和列都翻转一遍,结果只有这个+位置变为-,其它不变。

最后,有些位置翻转了偶数次,没有改变,有些位置翻转了奇数次,这些位置就是要进行翻转的位置。

因此mark可以简化为bool类型的数组,为0或false表示翻转偶数次,为1或true表示翻转奇数次。

Code

C++

#include <iostream>

using namespace std;

bool mark[4][4];

int main() 
	memset(mark, 0, sizeof(mark));
	for(int i = 0; i < 4; i++) 
		for(int j = 0; j < 4; j++) 
			char ch;
			cin >> ch;
			if(a == '+') 
				mark[i][j] = !mark[i][j];
				for(int k = 0; k < 4; k++) 
                    mark[i][k] = !mark[i][k];
                    mark[k][j] = !mark[k][j];
                
			
		
	
	
	int step = 0;
	int p_i[16], p_j[16];
	for(int i = 0; i < 4; i++) 
		for(int j = 0; j < 4; j++) 
			if(mark[i][j]) 
				p_i[step] = i + 1;
				p_j[step] = j + 1;
				step++;
			
		
	
	
	cout << step << endl;
	for(int i = 0; i < step; i++) 
		cout << p_i[i] << " " << p_j[i] << endl;
	
	return 0;
 

以上是关于POJ 2965.The Pilots Brothers‘ refrigerator的主要内容,如果未能解决你的问题,请参考以下文章

POJ 2965 The Pilots Brothers' refrigerator

poj 2965 The Pilots Brothers&#39; refrigerator

POJ 2965 The Pilots Brothers' refrigerator (暴力枚举)

POJ 2965.The Pilots Brothers‘ refrigerator

POJ 2965.The Pilots Brothers‘ refrigerator

poj2965 The Pilots Brothers' refrigerator 枚举或DFS