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;
}
描述
给出由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;
}
相关文章推荐
- Openjudge-计算概论(A)-数组顺序逆放
- OpenJudge计算概论-鸡尾酒疗法
- OpenJudge计算概论-自整除数
- OpenJudge计算概论-二维数组右上左下遍历
- openjudge 计算概论 字符串6:字符串最大跨距
- 【openjudge 计算概论(A)】[编程练习(数组练习)]
- Openjudge-计算概论(A)-求出e的值
- OpenJudge计算概论-忽略大小写比较字符串大小
- openjudge 计算概论 字符串1:统计字符数
- Openjudge-计算概论(A)-谁考了第k名
- Openjudge-计算概论(A)-放苹果
- OpenJudge计算概论-点和正方形的关系【判断点是否在正方形内部】
- OpenJudge计算概论-细菌实验分组
- OpenJudge计算概论-矩阵归零消减序列和
- OpenJudge计算概论-校门外的树
- openjudge 计算概论 字符串 2:单词倒排
- Openjudge-计算概论(A)-年龄与疾病
- Openjudge-计算概论(A)-取石子游戏
- OpenJudge计算概论-奇数求和
- OpenJudge计算概论-寻找下标