奇校验矩阵

 

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;
} 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值