您的位置:首页 > 运维架构

openjudge 计算概论-数组练习-错误侦测

2014-01-29 10:34 435 查看
总时间限制: 1000ms 内存限制: 65536kB

描述

给出由0和1组成的矩阵,如果矩阵的每一行和每一列的1的数量都是偶数,则认为符合条件。

你的任务就是检测矩阵是否符合条件,或者在仅改变一个矩阵元素的情况下能否符合条件。

"改变矩阵元素"的操作定义为0变成1,1变成0。

输入包含多个测试数据。每个测试数据有多行,第一行为矩阵的大小n(n < 100),以下n行为矩阵的值。

输入以0结束。
输出如果矩阵符合条件,则输出OK

如果矩阵仅改变一个矩阵元素就能符合条件,则输出Change bit (x,y),其中x和y为该元素的坐标

如果不符合以上两条,输出Corrupt

4

1 0 1 0

0 0 0 0

1 1 1 1

0 1 0 1

4

1 0 1 0

0 0 1 0

1 1 1 1

0 1 0 1

4

1 0 1 0

0 1 1 0

1 1 1 1

0 1 0 1

0

样例输出

OK

Change bit (2,3)

Corrupt

总的思想:因为只能“仅改变一个矩阵元素的情况下能否符合条件”,所以横列上1的个数 只能有一个是奇数;竖列一样。这交叉点即为Change
bit点。


#include <stdio.h>

#include <stdlib.h>

#define M 100

int main()

{

int n,arr[M][M],i,j,count_ver[M]= {0},count_hor[M]= {0},judge1,judge2,x,y;

while(scanf("%d",&n)&&n!=0)

{

for(i=0; i<n; i++) //清空数组!一定一定要在循环内初始啊!不然就是好多次wa啊!

{

count_ver[i]=0;count_hor[i]=0;

}

judge1=0; //初始化

judge2=0;

for(i=0; i<n; i++)

for(j=0; j<n; j++)

scanf("%d",&arr[i][j]);

//横列上数有多少个1

for(i=0; i<n; i++)

for(j=0; j<n; j++)

{

if(arr[i][j]==1)

count_hor[i]++;

}

//竖列上数有多少个1

for(i=0; i<n; i++)

for(j=0; j<n; j++)

{

if(arr[j][i]==1)

count_ver[i]++;

}

//判断横列上的1的个数,如果是偶数个,judge即为0;如果是奇数个,自加一;\

//因为有多个奇数的情况是无所谓的,所以,只要记录一个坐标就行,哪怕x或y多次被改了,只有judge=1的时候才会有用!

for(i=0; i<n; i++)

{

if(count_hor[i]%2!=0)

{

judge1++;

x=i;

}

//竖列 同上;

if(count_ver[i]%2!=0)

{

judge2++;

y=i;

}

}

if(judge1==0&&judge2==0)

printf("OK\n");

else if(judge1==1&&judge2==1)

printf("Change bit (%d,%d)\n",x+1,y+1); //注意坐标加1;

else

printf("Corrupt\n");

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: