总时间限制: 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
来源
6423
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[n+5][n+5];
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++){ //a[0][i]表示第i列元素的和,a[i][0]表示第i行元素的和,初始时设置为0
a[0][i]=0;
a[i][0]=0;
}
for(int col=1;col<=n;col++) //计算每列元素的和
for(int row=1;row<=n;row++)
a[0][col]+=a[row][col];
for(int row=1;row<=n;row++) //计算每行元素的和
for(int col=1;col<=n;col++)
a[row][0]+=a[row][col];
int i,j,cnum,rnum,row,col; //判断每列元素的和是否为奇数,cnum,rnum分别表示n列元素中出现奇数的次数 ,n行元素中出现奇数的次数,row,col标记出现奇数的位置
for(i=1,cnum=0;i<=n;i++){
if(a[0][i]%2==1){
cnum++; //计算全部的列中出现奇数的次数
col=i; //标记该位置,以便后续输出
}
}
for(j=1,rnum=0;j<=n;j++){ //判断每行元素的和是否为奇数
if(a[j][0]%2==1){
rnum++; //计算部的行中出现奇数的次数
row=j; //标记该位置,以便后续输出
}
}
if(cnum==0&&rnum==0){ //每行每列的元素之和都为偶数
cout<<"OK";
}else if(cnum==1&&rnum==1){ //刚好只有一行的元素和为奇数,一列的元素和为奇数的时候,才能通过修改某个位置的值来实现全部变成偶数
cout<<row<<' '<<col;
}else{ //否则不属于这两种情况,输出错误
cout<<"Corrupt";
}
return 0;
}