1048.检测矩阵

本文最后更新于 2023年9月16日 早上

NOI CCF 1048. 检测矩阵

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

输入 输入n + 1行,第1行为矩阵的大小n(0 < n < 100),以下n行为矩阵的每一行的元素,元素之间以一个空格分开。

输出 如果矩阵符合条件,则输出OK; 如果矩阵仅改变一个矩阵元素就能符合条件,则输出需要改变的元素所在的行号和列号,以一个空格分开。如果不符合以上两条,输出Corrupt。

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

样例输出 OK

题目分析

  1. 二进制计算每一行每一列加和
  2. 横纵奇数为0情况1,横纵奇数为1情况2,其余情况3

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
#include<iostream>
using namespace std;

int a[105][105];
int main() {
int n, x[105], y[105];
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[j][i];
}
}

for (int i = 1; i <= n; i++) {
x[i] = 0;
y[i] = 0;
}

for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
x[i] += a[j][i];
y[j] += a[j][i];
}
}


int cx = 0, cy = 0, xz, yz;
for (int i = 1; i <= n; i++) {
if (x[i] % 2 == 1) {
cx++;
xz = i;
}
if (y[i] % 2 == 1) {
cy++;
yz = i;
}
}

if (cx == 0 && cy == 0) cout << "OK";
else if (cx == 1 && cy == 1) cout << xz << " " << yz;
else cout << "Corrupt";

return 0;
}

1048.检测矩阵
https://www.harkerhand.online/CCF-NOI/1048/
作者
harkerhand
发布于
2020年4月12日
更新于
2023年9月16日
许可协议