码迷,mamicode.com
首页 > 其他好文 > 详细

1126 : 布尔矩阵

时间:2018-11-14 22:41:23      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:color   can   否则   整数   ret   div   string   两种方法   amp   

题目描述
布尔矩阵有一种奇偶性,即该矩阵所有行和所有列的和都是一个偶数。如下面这个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 }
 

 

1126 : 布尔矩阵

标签:color   can   否则   整数   ret   div   string   两种方法   amp   

原文地址:https://www.cnblogs.com/diandianer/p/9960286.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!