总时间限制: 1000ms 内存限制: 65536kB
描述
给出由 0 和 1 组成的矩阵,如果矩阵的每一行和每一列的 1 的数量都是偶数,则认为符合条件。
你的任务就是检测矩阵是否符合条件,或者在仅改变一个矩阵元素的情况下能否符合条件。
"改变矩阵元素" 的操作定义为 0 变成 1,1 变成 0。
输入
包含多个测试数据。每个测试数据有多行,第一行为矩阵的大小 n (n < 100),以下 n 行为矩阵的值。
输入以 0 结束。
输出
如果矩阵符合条件,则输出 OK
如果矩阵仅改变一个矩阵元素就能符合条件,则输出 Change bit (x,y),其中 x 和 y 为该元素的坐标
如果不符合以上两条,输出 Corrupt
样例输入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 4 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 4 1 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1 4 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0
|
样例输出
1 2 3
| OK Change bit (2,3) Corrupt
|
思路
- 输入一个整数
n
,创建一个 n∗n 的二维数组 a
和两个一维数组 line
和 row
。
- 读取矩阵的元素,并存储在二维数组
a
中。
- 遍历矩阵的每一行,统计每一行的元素为
1
的量。如果某一行的元素之和是奇数,将 line
数组的对应位置设为 1
,并将 line[0]
加 1
。line[0]
存储的是元素之和为奇数的行的数量。
- 遍历矩阵的每一列,统计每一列的元素为
1
的量。如果某一列的元素之和是奇数,将 row 数组的对应位置设为 1
,并将 row[0]
加 1
。row[0]
存储的是元素之和为奇数的列的数量。
- 检查
row[0]
和 line[0]
的值。如果都是 1
,输出 “Change bit (x,y)
”,其中 x
和 y
是元素之和为奇数的行和列的索引。如果都是 0
,输出 “OK
”。否则,输出 “Corrupt
”。
Code
C++ STL
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
| #include <bits/stdc++.h> using namespace std;
int main() { int n; while (cin >> n && n != 0) { array<array<int, 200>, 200> a; array<int, 100> line {} , row {}; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { cin >> a[i][j]; } } for(int i = 1; i <= n; i++) { int count = 0; for(int j = 1; j <= n; j++) { if(a[i][j] == 1) count++; } if(count % 2 == 1) { line[i] = 1; line[0]++; } } for(int i = 1, j = 1; j <= n; j++, i = 1) { int count = 0; for(; i <= n; i++) { if(a[i][j] == 1) count++; } if(count % 2 == 1) { row[j] = 1; row[0]++; } } if(row[0] == 1 && line[0] == 1) { int x, y; for(int i = 1; i <= n; i++) { if(line[i] == 1) {x = i; break;} } for(int i = 1; i <= n; i++) { if(row[i] == 1) {y = i; break;} } cout << "Change bit ("<< x << "," << y <<")" << endl; } else if(row[0] == 0 && line[0] == 0) cout << "OK" << endl; else cout << "Corrupt" << endl; } }
|
C++ array
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
| #include <bits/stdc++.h> using namespace std;
int main() { int n; while (cin >> n && n != 0) { int a[200][200] = {0}; int line[100] = {0}, row[100] = {0}; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { cin >> a[i][j]; } } for(int i = 1; i <= n; i++) { int count = 0; for(int j = 1; j <= n; j++) { if(a[i][j] == 1) count++; } if(count % 2 == 1) { line[i] = 1; line[0]++; } } for(int i = 1, j = 1; j <= n; j++, i = 1) { int count = 0; for(; i <= n; i++) { if(a[i][j] == 1) count++; } if(count % 2 == 1) { row[j] = 1; row[0]++; } } if(row[0] == 1 && line[0] == 1) { int x, y; for(int i = 1; i <= n; i++) { if(line[i] == 1) {x = i; break;} } for(int i = 1; i <= n; i++) { if(row[i] == 1) {y = i; break;} } cout << "Change bit ("<< x << "," << y <<")" << endl; } else if(row[0] == 0 && line[0] == 0) cout << "OK" << endl; else cout << "Corrupt" << endl; } }
|
C
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
| #include <stdio.h>
int main() { int n; while (scanf("%d", &n) && n != 0) { int a[200][200] = {0}; int line[100] = {0}, row[100] = {0}; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { scanf("%d", &a[i][j]); } } for(int i = 1; i <= n; i++) { int count = 0; for(int j = 1; j <= n; j++) { if(a[i][j] == 1) count++; } if(count % 2 == 1) { line[i] = 1; line[0]++; } } for(int i = 1, j = 1; j <= n; j++, i = 1) { int count = 0; for(; i <= n; i++) { if(a[i][j] == 1) count++; } if(count % 2 == 1) { row[j] = 1; row[0]++; } } if(row[0] == 1 && line[0] == 1) { int x, y; for(int i = 1; i <= n; i++) { if(line[i] == 1) {x = i; break;} } for(int i = 1; i <= n; i++) { if(row[i] == 1) {y = i; break;} } printf("Change bit (%d,%d)\n", x, y); } else if(row[0] == 0 && line[0] == 0) printf("OK\n"); else printf("Corrupt\n"); } }
|