Poj 2260 Error Correction——蒟蒻代码

Description

当一个布尔矩阵的每行每列的和都是偶数时,该矩阵具有奇偶均势的特性,即包含偶数个1,下面时一个4X4的具有奇偶均势的矩阵:
1 0 1 0

0 0 0 0

1 1 1 1

0 1 0 1
每行的和为:2、0、4、2。每列的和为:2、2、2、2。
请编写一个程序,输入矩阵,并判断它是否奇偶均势。如果不是,请判断是否能只改变一个数就能使矩阵奇偶均势。如果还是不行,则将它归类为“corrupt”。

Input

输入包含多个测试用例。每个测试用例的第一行输入的整数n(n<100)为矩阵大小。接下来的n行,每行都有n个数。这些数不是1就是0。最后一行0表示输入结束。

Output

在每个测试用例后输出一行,如果矩阵奇偶均势,则输出"OK",如果能够改变一个数就使矩阵奇偶均势,则输出"Change bit (i,j)",i,j时该数的位置,否则输出"Corrupt"。

Sample Input

4
1 0 1 0
0 0 0 0
1 1 1 1
0 1 0 1
4
1 0 1 0
0 0 1 0
1 1 1 1
0 1 0 1
4
1 0 1 0
0 1 1 0
1 1 1 1
0 1 0 1
0

Sample Output

OK
Change bit (2,3)
Corrupt

emmmm,又是参考好几个大佬代码写的题解

大佬思路是这样的:将每行每列的和丢到数组中去,若行和列的都是偶数,及ok,若行和列的奇数超过1就不行,但若行和列的奇数都只有一个,两个奇数所在地构成的坐标就是需要改变的数。
蒟蒻表示好厉害!
于是本蒟蒻就想,每行每列的和放到数组里岂不是要写两个循环,好麻烦的,然而我看了第二个大佬的代码,一个循环完事儿,orz,流下蒟蒟蒻的眼泪。(好巧妙啊——来自蒟蒟蒻的感叹)
关于奇偶性的判断,大佬代码是这样的:x[i]&1(orz,再次流下蒟蒟蒻的眼泪)
这里我来撸一波解释:
&是按位与,1的二进制是00000001,用短除法来思考二进制,若该数为奇数那么最后一位一定时1,若该数为偶数那么最后一位一定是0,所以x[i]&1若返回为0,则为偶数,返回为1,则为奇数

#include<stdio.h>
#include<string.h>
int matrix[105][105];
int x[105],y[105];
int main()
{
	int n;
 	while((scanf("%d",&n))&&n!=0){
  		memset(x,0,sizeof(x));/*清空列表,因为列表时随机的*/
        	memset(y,0,sizeof(y));
        	memset(matrix,0,sizeof matrix);
  		int index=0,indey=0,countx=0,county=0;
  		for(int i=0;i<n;i++){
   			for(int j=0;j<n;j++){
    				scanf("%d",&matrix[i][j]);
    				x[i]=x[i]+matrix[i][j];/*每行加起来*/
    				y[j]=y[j]+matrix[i][j];/*每列相加,每次第二个for循环只加一次*/
   			}
  		}
  		for(int i=0;i<n;i++){
   			if(x[i]&1){/*判断奇偶性,若返回为1则为奇*/
    				index=i+1;/*记录下该座标*/
    				countx++;/*记录有多少个奇数,大于1就是corrupt*/
   			}
   			if(y[i]&1){ 
    				indey=i+1;
    				county++;
   			}
  		}
  		if(countx==0&&county==0){
  			 printf("OK\n");
  		}else if(countx==1&&county&&1){
   			printf("Change bit (%d,%d)\n",index,indey);
		}else{
   			printf("Corrupt\n");
  		}
 	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43491303/article/details/88069269