CCF NOI1048 检测矩阵

来源:互联网 发布:js对象转化为字符串 编辑:程序博客网 时间:2024/06/06 01:57

问题链接: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 100int 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;}




1 0
原创粉丝点击