錯誤探測(C語言編程基礎之多維數組)

題目:錯誤探測

描述
給定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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章