1. 程式人生 > >CCF NOI1048. 檢測矩陣 (C++)

CCF NOI1048. 檢測矩陣 (C++)

1048. 檢測矩陣

題目描述

給定n*n由0和1組成的矩陣,如果矩陣的每一行和每一列的1的數量都是偶數,則認為符合條件。

你的任務就是檢測矩陣是否符合條件,或者在僅改變一個矩陣元素的情況下能否符合條件。

"改變矩陣元素"的操作定義為0變成1或者1變成0。

輸入

輸入n + 1行,第1行為矩陣的大小n(0 < n < 100),以下n行為矩陣的每一行的元素,元素之間以一個空格分開。

輸出

如果矩陣符合條件,則輸出OK;

如果矩陣僅改變一個矩陣元素就能符合條件,則輸出需要改變的元素所在的行號和列號,以一個空格分開。

如果不符合以上兩條,輸出Corrupt。

樣例輸入

4
1 0 1 0
0 0 0 0
1 1 1 1
0 1 0 1

樣例輸出

OK

資料範圍限制

C++程式碼

#include <iostream>
#include <cassert>

using namespace std;

const int N = 100;
int Matrix[N][N];

bool checkMatrixOK(int n)
{
    int even_one_in_row = 0;
    for(int row=1; row<=n; row++)
    {
        if (Matrix[
row-1][n] % 2 == 0) { even_one_in_row ++; } } int even_one_in_col = 0; for(int col=1; col<=n; col++) { if (Matrix[n][col-1] % 2 == 0) { even_one_in_col ++; } } if (even_one_in_row == n && even_one_in_col ==
n) { return true; } return false; } int main() { int n; cin >> n; assert(n > 0 && n < N); // initialize Matrix[n][col-1] for(int col=1; col<=n; col++) { Matrix[n][col-1] = 0; } // input data of matrix and calculate even one in each row and col for(int row=1; row<=n; row++) { Matrix[row-1][n] = 0; for(int col=1; col<=n; col++) { cin >> Matrix[row-1][col-1]; assert(Matrix[row-1][col-1]>=0 && Matrix[row-1][col-1]<=1); if (1 == Matrix[row-1][col-1]) { Matrix[row-1][n]++; Matrix[n][col-1]++; } } } if (true == checkMatrixOK(n)) { cout << "OK" << endl; } else { for(int row=1; row<=n; row++) { for(int col=1; col<=n; col++) { int oldRowValue = Matrix[row-1][n]; int oldColValue = Matrix[n][col-1]; Matrix[row-1][n] += 1 - 2*Matrix[row-1][col-1]; Matrix[n][col-1] += 1 - 2*Matrix[row-1][col-1]; if (true == checkMatrixOK(n)) { cout << row << " " << col << endl; return 0; } else { Matrix[row-1][n] = oldRowValue; Matrix[n][col-1] = oldColValue; } } } cout << "Corrupt" << endl; } return 0; }