描述
给定n*n由0和1组成的矩阵,如果矩阵的每一行和每一列的1的数量都是偶数,则认为符合条件。
你的任务就是检测矩阵是否符合条件,或者在仅改变一个矩阵元素的情况下能否符合条件。
"改变矩阵元素"的操作定义为0变成1或者1变成0。
输入
输入n + 1行,第1行为矩阵的大小n(0 < n < 100),以下n行为矩阵的每一行的元素,元素之间以一个空格分开。
输出
如果矩阵符合条件,则输出OK;
如果矩阵仅改变一个矩阵元素就能符合条件,则输出需要改变的元素所在的行号和列号,以一个空格分开。
如果不符合以上两条,输出Corrupt。
题其实不难,可以想到直接先算出每行每列的1的个遇到一点数,在判断就可以了。但会遇到一点问题,如何判断改变一个就可以使其符合要求。可想而知,如果有两列或两行都是不合格的那么一定不可能通过改变一个合格,所以要改变一个使其合格,必须找出另一列或者行也是不合格的才行,不然改变后必然让另一个不合格。而且,改变的点的坐标就是这列和这排(这样才可以影响两个嘛!);记录下来最后输出。如果判断出超过两行不合格直接break然后输出就好了。
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 using namespace std; 5 int mp[109][109];//矩阵 6 int n; //矩阵行列个数 7 int x,y;//改变的坐标 8 int ans;//记录有几个不合格 9 int main(){ 10 cin>>n; 11 for(int i=1;i<=n;i++){ 12 for(int j=1;j<=n;j++){ 13 cin>>mp[i][j]; 14 } 15 } 16 //读入 17 for(int i=1;i<=n;i++){ 18 int num=0; 19 for(int j=1;j<=n;j++){ 20 if(mp[i][j]==1) num++; 21 } 22 mp[i][0]=num; 23 } 24 for(int i=1;i<=n;i++){ 25 int num=0; 26 for(int j=1;j<=n;j++){ 27 if(mp[j][i]==1) num++; 28 } 29 mp[0][i]=num; 30 } 31 //将每行每列“1”的个数求出 32 for(int i=0;i<=n;i++){ 33 if(mp[0][i]%2!=0){ 34 ans++; 35 if(ans>=2){ 36 cout<<"Corrupt"; 37 break; 38 } 39 for(int j=0;j<=n;j++){ 40 if(mp[j][0]%2!=0){ 41 x=j; 42 y=i; 43 } 44 } 45 if(ans==1&&x==0&&y==0){ 46 cout<<"Corrupt"; 47 break; 48 } 49 } 50 } 51 //判断合格 52 if(ans==0){ 53 cout<<"OK"; 54 } 55 if(ans==1&&x!=0&&y!=0){ 56 cout<<x<<" "<<y; 57 } 58 }