题目描述
布尔矩阵有一种奇偶性,即该矩阵所有行和所有列的和都是一个偶数。如下面这个4*4的矩阵就具有奇偶性:
1 0 1 0
0 0 0 0
1 1 1 1
0 1 0 1
编写程序,读入一个n阶方阵并检查它是否是布尔矩阵。如果没有,你的程序应当再检查一下它是否可以通过修改一位(把0改为1,把1改为0)来使它为布尔矩阵,如果不可能,这个矩阵就被认为是破坏了。
输入
第一行是一个整数n ( 0< n < 100 ),代表该矩阵的阶数。然后输入n 行,每行n个整数(0或1)。
输出
如果矩阵是布尔矩阵,输出“OK”;如果能通过只修改该矩阵中的一位来使它成为布尔矩阵,则输出“Change bit(i,j)”,这里i和j是被修改的元素的行与列(行,列号从0开始),否则,输出“Corrupt”。
样例输入
4
1 0 1 0
0 0 0 0
1 1 1 1
0 1 0 1
样例输出
OK
两种方法解答:(思路差不多)
第一种:
1 #include<stdio.h>
2 #include<string.h>
3 #include<math.h>
4 #include<iostream>
5 #include<algorithm>
6 using namespace std;
7 #define ll long long
8 #define N 110
9 int a[N][N],n;
10 int heshi(int a[][N])
11 {
12 for(int i=0; i<n; i++)
13 {
14 int sum=0;
15 for(int j=0; j<n; j++)
16 sum+=a[i][j];
17 if(sum%2!=0)
18 return 0;
19 }
20 for(int i=0; i<n; i++)
21 {
22 int sum=0;
23 for(int j=0; j<n; j++)
24 sum+=a[j][i];
25 if(sum%2!=0)
26 return 0;
27 }
28 return 1;
29 }
30 int main()
31 {
32 int x,y,flag,i,j;
33 scanf("%d",&n);
34 for(i=0; i<n; i++)
35 for(j=0; j<n; j++)
36 scanf("%d",&a[i][j]);
37 if(heshi(a))
38 printf("OK\n");
39 else
40 {
41 flag=0;
42 for(i=0; i<n; i++)
43 {
44 for(j=0; j<n; j++)
45 {
46 if(a[i][j]==0)
47 a[i][j]=1;
48 else
49 a[i][j]=0;
50 if(heshi(a))
51 {
52 x=i,y=j;
53 flag=1;
54 break;
55 }
56 if(a[i][j]==0)
57 a[i][j]=1;
58 else
59 a[i][j]=0;
60 }
61 if(flag==1)
62 break;
63 }
64 if(flag==1)
65 printf("Change bit(%d,%d)\n",x,y);
66 else
67 printf("Corrupt\n");
68 }
69 return 0;
70 }
第二种:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 using namespace std;
6 #define N 110
7 int a[N][N],n;
8 int row[N];//存行的和
9 int line[N];//存列的和
10 int panduan()
11 {
12 for(int i=0; i<n; i++)
13 {
14 if(row[i]%2||line[i]%2)//思考清楚是&&还是||
15 return 0;
16 }
17 return 1;
18 }
19 int main()
20 {
21 int i,j,k,p,sum,flag,num;
22 scanf("%d",&n);
23 for(i=0; i<n; i++)
24 for(j=0; j<n; j++)
25 scanf("%d",&a[i][j]);
26 k=0;
27 p=0;
28 for(i=0; i<n; i++)
29 {
30 sum=0;
31 num=0;
32 for(j=0; j<n; j++)
33 {
34 sum+=a[i][j];//求行的和
35 num+=a[j][i];//求列的和
36 }
37 row[k++]=sum;
38 line[p++]=num;
39 }
40 if(panduan())
41 printf("OK\n");
42 else
43 {
44 flag=0;
45 for(i=0; i<n; i++)
46 {
47 for(j=0; j<n; j++)
48 {
49 row[i]++;
50 line[j]++;
51 if(panduan())
52 {
53 flag=1;
54 printf("Change bit(%d,%d)\n",i,j);
55 break;
56 }
57 row[i]--;
58 line[j]--;
59 }
60 if(flag==1)
61 break;
62 }
63 if(flag==0)
64 printf("Corrupt\n");
65 }
66 return 0;
67 }