04:错误探测

总时间限制: 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;
}
发布了36 篇原创文章 · 获赞 0 · 访问量 355

猜你喜欢

转载自blog.csdn.net/weixin_44437496/article/details/103996673
04