題目:錯誤探測
描述
給定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
解題思路
解決方法:
對每一行進行求和,如果是偶數,就不用管,如果是奇數,就記錄下行號。
然後繼續對每一行進行遍歷,如果記錄的行號更新了,就直接輸出Corrupt退出。
然後對每一列進行求和,同上一樣進行操作
如果行和列全是偶數,則輸出OK
如果行號和列號有且只記錄一次,就輸出該記錄的行號和列號
如果行號和列號只有一個記錄更新了,或者行號和列號更新了兩次或者兩次以上,就輸出Corrupt。
代碼
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int main()
{
int sum=0;
int n;
int i,j;
int recode_i=0,recode_j=0;
int matrix[MAX][MAX];
scanf("%d", &n);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
scanf("%d", &matrix[i][j]);
for (i=1;i<=n;i++)
{
sum = 0;
for (j=1;j<=n;j++)
{
sum += matrix[i][j];
}
if (sum%2)
{
if (recode_i)
{
printf("Corrupt");
return 0;
}
else
recode_i=i;
}
}
for (j=1;j<=n;j++)
{
sum = 0;
for (i=1;i<=n;i++)
{
sum += matrix[i][j];
}
if (sum%2)
{
if (recode_j)
{
printf("Corrupt");
return 0;
}
else
recode_j=j;
}
}
if (recode_i==0 && recode_j==0)
printf("OK");
else if (recode_i && recode_j)
printf("%d %d", recode_i, recode_j);
else
printf("Corrupt");
return 0;
}