【题目链接】
【题目考点】
1. 二维数组
【解题思路】
改变一个位置的数字,会使该位置所在行和列的1的数量的奇偶性发生变化。
所以只有存在一行1的数量为奇数的行与一列1的数量为奇数的列时,改变这两个行列交点位置的数字,可以使得所有的行列的1的数量都为偶数。
其它情况下,只修改一个位置的数字无法使得所有的行列的1的数量都为偶数。
- 如果每行每列1的数量都是偶数,输出OK。
- 如果只有一行与一列1的数量是奇数,输出这两个行列交点的位置。
- 否则输出:Corrupt。
用变量x记录已经出现过的1个数为奇数的行,再用变量y记录已经出现过的1个数为奇数的列,初值都为0。
- 如果遇到一个奇数行(或列),此时x(或y)为0,那么将x(或y)设为该行(列)号。
- 如果遇到一个奇数行(或列),此时x(或y)不为0,那么输出Corrupt,程序结束。
【题解代码】
解法1:
#include<bits/stdc++.h>
using namespace std;
#define N 105
int main()
{
int n, a[N][N], x = 0, y = 0;//x:1为奇数个的行的行号 y:1为奇数个的列的列号
cin >> n;
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)//看每行1的个数
{
int ct = 0;//计数 本行1的个数
for(int j = 1; j <= n; ++j)
ct += a[i][j];
if(ct % 2 == 1)
{
if(x == 0)
x = i;
else
{
cout << "Corrupt";
return 0;
}
}
}
for(int j = 1; j <= n; ++j)//看每列1的个数
{
int ct = 0;//计数 本列1的个数
for(int i = 1; i <= n; ++i)
ct += a[i][j];
if(ct % 2 == 1)
{
if(y == 0)
y = j;
else
{
cout << "Corrupt";
return 0;
}
}
}
if(x == 0 && y == 0)
cout << "OK";
else if(x != 0 && y != 0)
cout << x << ' ' << y;
else
cout << "Corrupt";
return 0;
}