标签: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 }
标签:color can 否则 整数 ret div string 两种方法 amp
原文地址:https://www.cnblogs.com/diandianer/p/9960286.html