void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出一个布尔矩阵,由0,1组成,要求每行每列的和都为偶数,如果不满足,改动某一个位置状态可行的话就输出此位置,否则输出错误,如果不用改动就满足

就输出ok。。。想法依然简单,我想的是输入数据时候就统计各行格列的和,用b[][]来存储,然后依次找出行列中和为奇数的个数,如果某个行或者列的统计个数

等于n,矩阵长度,那么就是说此时没有可以有列或者行可以与此更改,就是错误,感觉这里可以再优化

1 #include <stdio.h>
2  int main()
3 {
4 int n,a[100][100];
5 while(scanf("%d",&n)!=EOF,n)
6 {
7 int b[100][2]={0},c[100][2]={0},k=0,n1,n2;
8 bool flag=true;
9 for(int i=1;i<=n;i++)
10 for(int j=1;j<=n;j++)
11 {scanf("%d",&a[i][j]);
12 b[i][0]+=a[i][j];
13 b[j][1]+=a[i][j];
14 }
15 //for(int j=1;j<=n;j++)
16 //printf("%d %d \n",b[j][0],b[j][1]);
17   for(int i=1;i<=n;i++)
18 for(int j=1;j<=n;j++)
19 {
20 if(b[i][0]%2+b[j][1]%2==0)continue;
21 else if(b[i][0]%2==1&&b[j][1]%2==0)c[i][0]++;
22 else if(b[i][0]%2==0&&b[j][1]%2==1)c[j][1]++;
23 else if(b[i][0]%2+b[j][1]%2==2)
24 {if(k==1){flag=false;break;}
25 else
26 {k++;n1=i;n2=j;}
27 }
28
29
30 }
31 for(int i=1;i<=n;i++)if(c[i][0]==n||c[i][1]==n)flag=false;
32 if(!flag)printf("Corrupt\n");
33 else if(k==1)printf("Change bit (%d,%d)\n",n1,n2);
34 else printf("OK\n");
35 }
36 return 0;}
posted on 2011-04-14 22:51  void-man  阅读(204)  评论(0)    收藏  举报