ʕ·͡ˑ·ཻ ʕ•̫͡• ʔ•̫͡•ཻʕ•̫͡•ʔ•͓͡•ʔ

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;
}