• 布尔矩阵的奇偶性


    布尔矩阵的奇偶性

    题目描述

    一个布尔方阵具有奇偶均势特性,当且仅当 每行、每列总和为偶数,即包含偶数个1。如下面这个4*4的矩阵就具有奇偶均势特性:
    1 0 1 0
    0 0 0 0
    1 1 1 1
    0 1 0 1
    编写程序,读入一个n阶方阵并检查它是否具有奇偶均势特性。如果没有,你的程序应当再检查一下它是否可以通过修改一位(把0改为1,把1改为0)来使它具有奇偶均势特性;如果不可能,这个矩阵就被认为是破坏了。

    输入

    第一行是一个整数n ( 0< n < 100 ),代表该方阵的阶数。然后输入n 行,每行n个整数(0或1)。

    输出

    如果矩阵是布尔矩阵,输出“OK”;如果能通过只修改该矩阵中的一位来使它成为布尔矩阵,则输出“Change bit(i,j)”,这里i和j是被修改的元素的行与列(行,列号从0开始);否则,输出“Corrupt”。

    样例输入

    4
    1 0 1 0
    0 0 0 0
    1 1 1 1
    0 1 0 1
    
    • 1
    • 2
    • 3
    • 4
    • 5

    样例输出

    OK
    
    • 1

    思路

    这道题整体并不算难,不过还是需要厘清思路;

    首先,从输出结果出发,仅有三种可能的输出结果

    1. 是布尔矩阵
    2. 经过更改一次矩阵值可以得到布尔矩阵
    3. 即使经过一次更改矩阵值,也不是布尔矩阵(这句理解很重要)

    如果考虑其他错误情况,就太多了;

    但是,如果说只经过一次更改就可以得到布尔矩阵,

    其实我们在遍历判定的时候一定是可以找到错误的行和错误的列(错误的行列一定都存在)的

    那么我们只要将对应值更改一下,再次判定即可,若判定成功,则输出结果2,否则直接输出结果3即可

    参考代码

    #include
    
    using namespace std;
    
    int a[100][100] = {0};
    
    bool isBool(int a[][100], int n) { 
        /// 判定是否为布尔矩阵 // 注意第二个中括号指定大小
        for(int i = 0; i < n; i++) {
            int sum_row = 0, sum_col = 0;
            for(int j = 0; j < n; j++) {
                sum_row += a[i][j];
                sum_col += a[j][i];
            }
            if(sum_row % 2 != 0 || sum_col % 2 != 0)
                return false;
        }
        return true;
    }
    
    int main() {
        int n, err_row = -1, err_col = -1;
    
        cin >> n;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                cin >> a[i][j];
            }
        }
    
        for(int i = 0; i < n; i++) {
            int sum_row = 0, sum_col = 0;
            for(int j = 0; j < n; j++) {
                sum_row += a[i][j];
                sum_col += a[j][i];
            }
            if(sum_row % 2 != 0) {
                err_row = i;
            }
            if(sum_col % 2 != 0) {
                err_col = i;
            }
        }
    
        if(err_row >= 0 && err_col >= 0) {
            if(a[err_row][err_col] == 0) a[err_row][err_col] = 1;
            else a[err_row][err_col] = 0;
        }
        
        if(isBool(a, n) && err_row == -1 && err_col == -1)
            cout << "OK";
        else if(isBool(a, n) && err_row >= 0 && err_col >= 0)
            printf("Change bit(%d,%d)", err_row, err_col);
        else cout << "Corrupt";
    
        return 0;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    这里有个注意点就是,当二维数组作为函数参数传递时,第二个[]中要指定大小

    还有就是写代码认真一些,尽量避免因为写错变量导致结果错误

    传统节目:

    在这里插入图片描述

  • 相关阅读:
    vue快速入门(三十六)组件通信-子传父
    Servlet系列:生命周期(init、 service、destroy)详解
    vue 弹框中包含avue-curd /el-table第一次点击样式正常 再次点击表格序号列和其他列错位
    RHCE(三)--- 基于HTTP、HTTPS搭建静态网页
    力扣:32-最长有效括号
    零代码编程:用ChatGPT批量下载谷歌podcast上的播客音频
    MHA高可用配置及故障切换
    tda4vm mcu1_0应用程序开发系列之ADC采样
    SRT简介
    基于libjpeg-turbo库的jpeg4py安装与使用记录
  • 原文地址:https://blog.csdn.net/m0_51126511/article/details/136662096