C++编程一道题目

给出由0和1组成的矩阵,如果矩阵的每一行和每一列的1的数量都是偶数,则认为符合条件。
你的任务就是检测矩阵是否符合条件,或者在仅改变一个矩阵元素的情况下能否符合条件。
"改变矩阵元素"的操作定义为0变成1,1变成0。
关于输入 :
包含多个测试数据。每个测试数据有多行,第一行为矩阵的大小n(n<100),以下n行为矩阵的值。
输入以0结束。
关于输出 :
如果矩阵符合条件,则输出OK
如果矩阵仅改变一个矩阵元素就能符合条件,则输出Change bit (x,y),其中x和y为该元素的坐标
如果不符合以上两条,输出Corrupt
例子输入
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
例子输出
OK
Change bit (2,3)
Corrupt

分别扫描数组的每行每列,记录下有奇数个行的行标个数和奇数个列的列标个数

如果两者均为0,则符合条件

如果row和col均为1,则要改变

其余情况均为Corrupt

#include<stdio.h>
#define N_MAX 100
int main(){
    int n,a[N_MAX][N_MAX];    //数组尺寸、数组
    int i,j;                  //遍历用
    int x,y,sum,row,col;      //记录修改坐标,临时求和,奇数个1的行个数、列个数
    scanf("%d",&n);
    while(n){
     x = y = -1;
     row = col = 0;
        if(n==1){
            scanf("%d",&x);
            if(x==0){
                printf("OK\n");
            }else{
                printf("Change bit(1,1)\n");    //不知道这里对不对?
            }
            scanf("%d",&n);
            continue;
        } 
        for(i=0;i<n;i++){
            sum = 0;
            for(j=0;j<n;j++){
                scanf("%d",&a[i][j]);
                sum += a[i][j];
            }
            if(sum%2){
                row ++;
                if(x==-1) x = i;
            } 
        }
        for(j=0;j<n;j++){
            sum = 0;
            for(i=0;i<n;i++){
                sum += a[i][j];
            }
            if(sum%2){
                col ++;
                if(y==-1) y = j;
            } 
        }
        if(row==0 && col==0){
            printf("OK\n");
        }else if(row==1 && col==1){
            printf("Change bit(%d,%d)\n",x+1,y+1);//看输出示例,矩阵坐标应该从1算起         
        }else{
            printf("Corrupt\n");
        }
        scanf("%d",&n);
    }
    return 0;
}

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答