Time Limit: 1 Sec Memory Limit: 128 MB
Description
对于一个给定的布尔矩阵,它的每一行每一列各个数的和必然是确定的。下面给出一个4 x 4的布尔矩阵。
1 1 1 0
0 1 0 0
0 1 0 0
0 0 0 1
很明显,这个布尔矩阵每行各数的和依次位3,1,1和1,每列各数字的和依次为1,3,1和1,每行每列之和都是奇数。我们称所有行和列和都是奇数的矩阵满足奇校验.
你的任务是写一个程序来判断一个矩阵是否满足奇校验。如果不是的话,请检查如果更改矩阵中某一个布尔数的值,使其满足奇校验。如果依旧不可达成,则停止工作。
Input
输入会有多个测试数据。每个测试数据会以一个int型n开始(n<=100),表示这个矩阵的大小为n*n。接下来的n行将给出这个矩阵。当n为0的时候,退出程序。
Output
对于每组测试数据,只有一行输出。如果这个矩阵已经是奇校验,直接输出“OK”;如果需要改变一个布尔数的值后满足条件,输出“Change bit (i,j)”,i,j表示所需转换位所在的行和列。如果依旧不可达成,输出“Corrupt”。
Sample Input
4
1 1 1 0
0 1 0 0
0 1 0 0
0 0 0 1
4
1 1 1 0
0 1 1 0
0 1 0 0
0 0 0 1
4
1 1 1 0
0 1 0 0
1 1 0 0
1 0 0 1
0
Sample Output
OK
Change bit (2,3)
Corrupt
题解
思路:计算每行(列)加和,找出偶数行(列)的个数并标记当前一行位置(为找到可以修改的唯一点);
如果不存在偶数行和列,是奇校验OK;
如果存在偶数的行和列,行和列的个数均不超过1,则意味着可以修改行和列交叉的点,使其矩阵是奇校验;
行或列的个数超过1,不满足条件。
#include <stdio.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n == 0)
break;
int i,j,k,a[101][101];
int book_hang, book_lie ,flag_hang = 0, flag_lie = 0;
for(i = 0 ; i < n; i++)
for(j = 0 ; j < n; j++)
scanf("%d",&a[i][j]);
for(i = 0 ; i < n; i++){
int sum = 0;
for(j = 0 ; j < n; j++)
sum += a[i][j];
if(sum % 2 == 0){
flag_hang++;
book_hang = i;
}
}
for(i = 0 ; i < n; i++){
int sum = 0;
for(j = 0 ; j < n; j++)
sum += a[j][i];
if(sum % 2 == 0){
flag_lie++;
book_lie = i;
}
}
if(flag_hang == 0 && flag_lie == 0)
printf("OK\n");
else if(flag_hang < 2 &&flag_lie < 2)
printf("Change bit (%d,%d)\n",book_hang+1,book_lie+1);
else
printf("Corrupt\n");
}
return 0;
}
6143

被折叠的 条评论
为什么被折叠?



