题目描述
一个布尔矩阵有一种奇偶性,即该矩阵所有行和所有列的和都是偶数。下面这4×4的矩阵就具有奇偶性:
1 0 1 0
0 0 0 0
1 1 1 1
0 1 0 1
它所有行的和是2,0,4,2。它所有列的和是2,2,2,2。
现请你编写一个程序,读入这个矩阵并检查它是否具有奇偶性。如果没有,你的程序应当再检查一下它是否可以通过修改一位(把0修改为1,把1修改为0)来使它具有奇偶性。如果不可能,这个矩阵就被认为是破坏了。
1 0 1 0
0 0 0 0
1 1 1 1
0 1 0 1
它所有行的和是2,0,4,2。它所有列的和是2,2,2,2。
现请你编写一个程序,读入这个矩阵并检查它是否具有奇偶性。如果没有,你的程序应当再检查一下它是否可以通过修改一位(把0修改为1,把1修改为0)来使它具有奇偶性。如果不可能,这个矩阵就被认为是破坏了。
输入
输入包含多组测试数据。每组测试数据的第一行是一个整数n(1<=n<=100),代表该矩阵的大小。在接下来的行中,每行有n个整数。矩阵是由0或1构成的。n=0时,输入结束。
输出
对于每组输入,如果这个矩阵具有奇偶性,则输出“OK”。如果奇偶性能通过只修改该矩阵中的一位来建立,那么输出“Change bit (i,j)”,这里i和j是被修改的这位的行号和列号。否则,输出“Corrupt”。
样例输入
4 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 4 1 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1 4 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0
样例输出
OK Change bit (2,3) Corrupt
挺简单的一道题,穷举模拟就行了,够暴力的。
1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 5 bool judge(int a[][101],int n) 6 { 7 int x=1,y=1; 8 for(int i=1;i<=n;i++) 9 { 10 int f=0,t=0; 11 for(int j=1;j<=n;j++) 12 { 13 f+=a[i][j]; 14 t+=a[j][i]; 15 } 16 if(f%2) 17 x=0; 18 if(t%2) 19 y=0; 20 } 21 if(x&&y) 22 return true; 23 else 24 return false; 25 } 26 27 void change(int a[][101],int n) 28 { 29 for(int i=1;i<=n;i++) 30 { 31 for(int j=1;j<=n;j++) 32 { 33 if(a[i][j]) 34 { 35 a[i][j]=0; 36 if(judge(a,n)) 37 { 38 printf("Change bit (%d,%d) ",i,j); 39 return ; 40 } 41 else 42 { 43 a[i][j]=1; 44 continue; 45 } 46 } 47 else 48 { 49 a[i][j]=1; 50 if(judge(a,n)) 51 { 52 printf("Change bit (%d,%d) ",i,j); 53 return ; 54 } 55 else 56 { 57 a[i][j]=0; 58 continue; 59 } 60 } 61 } 62 } 63 printf("Corrupt "); 64 return ; 65 } 66 67 int main() 68 { 69 int n; 70 while(scanf("%d",&n),n) 71 { 72 int a[101][101]; 73 for(int i=1;i<=n;i++) 74 { 75 for(int j=1;j<=n;j++) 76 { 77 scanf("%d",&a[i][j]); 78 } 79 } 80 if(judge(a,n)) 81 printf("OK "); 82 else 83 change(a,n); 84 } 85 return 0; 86 }