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;
}




posted on 2017-04-25 02:12  海岛Blog  阅读(360)  评论(0编辑  收藏  举报

导航