04:错误探测
总时间限制:
1000ms
内存限制:
65536kB
描述
给定n*n由0和1组成的矩阵,如果矩阵的每一行和每一列的1的数量都是偶数,则认为符合条件。 你的任务就是检测矩阵是否符合条件,或者在仅改变一个矩阵元素的情况下能否符合条件。 “改变矩阵元素”的操作定义为0变成1或者1变成0。
输入
输入n + 1行,第1行为矩阵的大小n(0 < n < 100),以下n行为矩阵的每一行的元素,元素之间以一个空格分开。
输出
如果矩阵符合条件,则输出OK; 如果矩阵仅改变一个矩阵元素就能符合条件,则输出需要改变的元素所在的行号和列号,以一个空格分开。 如果不符合以上两条,输出Corrupt。
样例输入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 样例输入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 2 3 4 5 6 7 8
| 样例输出1 OK
样例输出2 2 3
样例输出3 Corrupt
|
WA代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include<bits/stdc++.h> using namespace std;
const int M = 100+5; const int N = 100+5;
int a[M][N]={0};
int main(){ int n; int c = 0,r = 0; cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>a[i][j]; a[0][j] = (a[0][j]+a[i][j])%2;//感觉这个地方还是很巧妙的(get) a[i][0] = (a[i][0]+a[i][j])%2; } } for(int j=1;j<=n;j++){ if(a[0][j]==1) r = j; } for(int i=1;i<=n;i++){ if(a[i][0]==1) c = i; } if(c==0&&r==0) cout<<"OK"<<endl; else if(c!=0&&r!=0)cout<<c<<" "<<r<<endl; else cout<<"Corrupt"<<endl; return 0; }
|
感觉思路也没什么问题,写了几组数据测试发现其中一组数据有问题
1 2 3 4 5
| 4 0 0 0 0 1 1 0 1 0 0 0 1 1 1 1 1
|
当有多行/列为奇数时,只返回第一组检测的序号。(其实这个时候应该是Corrupt)
所以应该增加两个变量来记录行或列为奇数的行数/列数。
AC代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include<bits/stdc++.h> using namespace std;
const int M = 100+5; const int N = 100+5;
int a[M][N]={0};
int main(){ int n; int c = 0,r = 0,c1 = 0,r1 = 0; cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>a[i][j]; a[0][j] = (a[0][j]+a[i][j])%2; a[i][0] = (a[i][0]+a[i][j])%2; } } for(int j=1;j<=n;j++){ if(a[0][j]==1){ r = j; r1++; } } for(int i=1;i<=n;i++){ if(a[i][0]==1){ c = i; c1++; } } if(c1==0&&r1==0) cout<<"OK"<<endl; else if(c1==1&&r1==1)cout<<c<<" "<<r<<endl; else cout<<"Corrupt"<<endl; return 0; }
|