CCF NOI1048. 檢測矩陣 (C++)
阿新 • • 發佈:2018-12-12
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;
}