1 条题解
-
0
解题思路
-
检查矩阵是否已经满足奇偶校验特性
- 计算每一行的和,判断是否为偶数。
- 计算每一列的和,判断是否为偶数。
- 如果所有行和列的和均为偶数,输出
"OK"
。
-
检查是否可以仅修改一个比特位来满足条件
- 统计行和列中不满足偶数和的数量。
- 如果恰好存在一行和一列的和是奇数,那么翻转它们的交点可能会使所有行和列的和变为偶数。
- 检查翻转该位置后是否所有行和列的和都变为偶数。如果是,输出
"Change bit (i,j)"
。
-
否则,矩阵无法修正,输出
"Corrupt"
- 如果存在多行或多列不满足奇偶校验,则无法通过修改单个比特位来修正,直接判定为损坏。
C++ 代码实现
#include <iostream> #include <vector> using namespace std; void checkParity(const vector<vector<int > >& matrix, int n) { vector<int> rowSum(n, 0); // 存储每行的和 vector<int> colSum(n, 0); // 存储每列的和 // 计算每行和每列的和 for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { rowSum[i] += matrix[i][j]; colSum[j] += matrix[i][j]; } } int badRow = -1, badCol = -1; bool rowValid = true, colValid = true; // 检查行是否全部满足偶数 for (int i = 0; i < n; ++i) { if (rowSum[i] % 2 != 0) { if (badRow == -1) badRow = i; else rowValid = false; // 多于一个奇数行,无法修正 } } // 检查列是否全部满足偶数 for (int j = 0; j < n; ++j) { if (colSum[j] % 2 != 0) { if (badCol == -1) badCol = j; else colValid = false; // 多于一个奇数列,无法修正 } } // 情况1:矩阵已经满足条件 if (badRow == -1 && badCol == -1) { cout << "OK" << endl; return; } // 情况2:可以修正 if (rowValid && colValid && badRow != -1 && badCol != -1) { // 尝试翻转 (badRow, badCol) 处的比特 int newRowSum = rowSum[badRow] - matrix[badRow][badCol] + (1 - matrix[badRow][badCol]); int newColSum = colSum[badCol] - matrix[badRow][badCol] + (1 - matrix[badRow][badCol]); if (newRowSum % 2 == 0 && newColSum % 2 == 0) { cout << "Change bit (" << badRow + 1 << "," << badCol + 1 << ")" << endl; return; } } // 情况3:无法修正 cout << "Corrupt" << endl; } int main() { int n; while (cin >> n && n != 0) { vector<vector<int> > matrix(n, vector<int>(n)); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { cin >> matrix[i][j]; } } checkParity(matrix, n); } return 0; }
-
- 1
信息
- ID
- 1261
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者