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; }