試題描述
給定n*n由0和1組成的矩陣,如果矩陣的每一行和每一列的1的數量都是偶數,則認為符合條件。 你的任務就是檢測矩陣是否符合條件,或者在僅改變一個矩陣元素的情況下能否符合條件。 "改變矩陣元素"的操作定義為0變成1或者1變成0。
輸入格式
輸入n + 1行,第1行為矩陣的大小n(0 < n < 100),以下n行為矩陣的每一行的元素,元素之間以一個空格分開。
輸出格式
如果矩陣符合條件,則輸出OK;如果矩陣僅改變一個矩陣元素就能符合條件,則輸出需要改變的元素所在的行號和列號,以一個空格分開。如果不符合以上兩條,輸出Corrupt。
樣例輸入
樣例輸入1
4
1 0 1 0
0 0 0 0
1 1 1 1
0 1 0 1
樣例輸入2
4
1 0 1 0
0 0 1 0
1 1 1 1
0 1 0 1
樣例輸入3
4
1 0 1 0
0 1 1 0
1 1 1 1
0 1 0 1
樣例輸出
樣例輸出1
OK
樣例輸出2
2 3
樣例輸出3
Corrupt
其它說明
二維數組//做法;先把每一列每一行遍歷一次,同時記錄每一行每一列奇數行和列的個數,然后(重要的來了)如果奇數的(行和列)都==0,則輸出OK,如果行列都
==1,則才輸出b[0]和c[0]的值,如果不滿足則輸出corrupt。因為題目要求的是只能修改一次!
#include<stdio.h> #include<string.h> int main() { int a[101][101]; int b[100],c[100]; int n; int i,j,s1,s2; while(~scanf("%d",&n)) { b[0]=0; c[0]=0; for(i=1,s1=0,s2=0;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&a[i][j]); if(a[i][j]==1) { b[i]++;//記錄第i行的1的個數; } } } for(j=1;j<=n;j++) { for(i=1;i<=n;i++) { if(a[i][j]==1) { c[j]++;//記錄第j列的1的個數; } } } for(i=1;i<=n;i++) { if(b[i]%2!=0)//判斷第i行的1的個數是否為奇數; { s1++; b[0]=i;//記錄有幾個奇數行;下面對於列的判斷同理; } if(c[i]%2!=0) { s2++; c[0]=i; } } if(s1==0&&s2==0) printf("OK\n"); else if(s1==1&&s2==1) { printf("%d %d\n",b[0],c[0]); } else printf("Corrupt\n"); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); } return 0; }