题目描述
布尔矩阵具有奇偶均势特性, 当且仅当每行、每列的元素总和为偶数。 例如 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 每行每列的元素总和皆为偶数, 即具有奇偶均势特性。 现输入一个矩阵, 判断是否具有奇偶均势特性。若否那么判断可否通过修改某一位置上的数(0变1或1变0), 使得该布尔矩阵具有奇偶均势特性。 行则输出改变元素的坐标,否则为被破坏。
输入
第一行为整数n(1 ≤ n ≤ 100). 接下来n行, 每行n个数(0 or 1)。
输出
如有奇偶均势特性则输出“OK”, 若可通过修改一位请输出“Change bit(i, j)”, i,j 为修改位置的横纵坐标。若不行则输出"Corrupt"。(注意行列从1开始, 并且逗号后面有个空格。
样例
输入 Copy 4 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1
输出 Copy OK 来源/分类 数组
题解
以下是C++代码实现:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int row[n] = {0}, col[n] = {0}; // 分别记录每行和每列的元素总和
int oddRow = 0, oddCol = 0; // 分别记录奇数行和奇数列的数量
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int num;
cin >> num;
row[i] += num;
col[j] += num;
}
if (row[i] % 2 == 1) oddRow++;
}
for (int i = 0; i < n; i++) {
if (col[i] % 2 == 1) oddCol++;
}
if (oddRow == 0 && oddCol == 0) {
cout << "OK" << endl;
} else if (oddRow == 1 && oddCol == 1) {
int rowIdx = -1, colIdx = -1;
for (int i = 0; i < n; i++) {
if (row[i] % 2 == 1) rowIdx = i;
if (col[i] % 2 == 1) colIdx = i;
}
cout << "Change bit(" << rowIdx + 1 << ", " << colIdx + 1 << ")" << endl;
} else {
cout << "Corrupt" << endl;
}
return 0;
}