CCF NOI1048 检测矩阵
问题链接: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; }