NOI / 1.8编程基础之多维数组 04:错误探测

04:错误探测

总时间限制: 
1000ms
 
内存限制: 
65536kB
描述

给定n*n由0和1组成的矩阵,如果矩阵的每一行和每一列的1的数量都是偶数,则认为符合条件。
你的任务就是检测矩阵是否符合条件,或者在仅改变一个矩阵元素的情况下能否符合条件。
"改变矩阵元素"的操作定义为0变成1或者1变成0。

输入
输入n + 1行,第1行为矩阵的大小n(0 < n < 100),以下n行为矩阵的每一行的元素,元素之间以一个空格分开。
输出
如果矩阵符合条件,则输出OK;
如果矩阵仅改变一个矩阵元素就能符合条件,则输出需要改变的元素所在的行号和列号,以一个空格分开。
如果不符合以上两条,输出Corrupt。
样例输入
样例输入1
4
1 0 1 0
0 0 0 0
1 1 1 1
0 1 0 1

样例输入2
4
1 0 1 0
0 0 1 0
1 1 1 1
0 1 0 1

样例输入3
4
1 0 1 0
0 1 1 0
1 1 1 1
0 1 0 1
样例输出
样例输出1
OK

样例输出2
2 3

样例输出3
Corrupt

解题思路(202012-二级):

分别计算行、列的奇数个数

1. 行列奇数行个数均为0,"OK"

2. 行列奇数行个数均为1,则修改一个位置即可。

3. 否则:Corrupt

#include <iostream>
using namespace std;
int main()
{
    // in 1
    int n;
    cin >> n;
    // in 2 and algorithm
    int row[100] = {0};                // 行累计 
    int col[100] = {0};                // 列累计 
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            int b;
            cin >> b;
            col[j] = (col[j] + b) % 2;
            row[i] = (row[i] + b) % 2;
        }
    }
    //
    int row_mark, column_mark;
    int rows = 0, columns = 0;
    // 行列奇数计数 
    for (int i=0; i<n; i++) {
           if (row[i] > 0) {
               row_mark = i + 1;
               rows++;
           }
       }
       for (int i=0; i<n; i++) {
           if (col[i] > 0){
               column_mark = i + 1;
               columns++;
           }
    }
    // out
    if ((rows==0) && (columns==0)) {
        cout << "OK";
    } else if ((rows==1) && (columns==1)) {
        cout << row_mark << " " << column_mark;
    } else {
        cout << "Corrupt";
    }
    return 0;
}

 

posted @ 2020-12-06 20:07  linux_farmer  阅读(399)  评论(0编辑  收藏  举报