问题链接:CCF NOI1048 检测矩阵。
时间限制: 1000 ms 空间限制: 262144 KB
题目描述
给定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
数据范围限制
问题分析
行列同时进行奇偶校验,最后再进行判定。
程序说明
(略)
- 虽然题意中给的是常量的矩阵大小,但是用宏来定义一个符号常量更为合理。
参考链接:(略)。
100分通过的C语言程序:
#include <stdio.h>
#include <string.h>
#define N 100
int a[N][N];
int rowflag[N], colflag[N];
int main(void)
{
int n, i, j;
scanf("%d", &n);
for(i=0; i<n; i++)
for(j=0; j<n; j++)
scanf("%d", &a[i][j]);
// 设置初始值
memset(rowflag, 0, sizeof(rowflag));
memset(colflag, 0, sizeof(colflag));
// 行和列1的个数奇偶设置
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if(a[i][j] == 1) {
rowflag[i] = 1 - rowflag[i];
colflag[j] = 1 - colflag[j];
}
// 判定和输出结果
int sumrow=0, sumcol=0, row, col;
for(i=0; i<n; i++) {
sumrow += rowflag[i];
sumcol += colflag[i];
if(rowflag[i])
row = i;
if(colflag[i])
col = i;
}
if(sumrow == 0 && sumcol == 0)
printf("OK\n");
else if(sumrow == 1 && sumcol == 1) {
printf("%d %d\n", row + 1, col + 1);
} else
printf("Corrupt\n");
return 0;
}