openjudge 错误探测

描述

给定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 } 

posted @ 2018-07-20 22:30  nono_ttaa  阅读(905)  评论(0编辑  收藏  举报