NOI.8.04错误勘探(暴力解法,简单)

描述

给定n*n由0和1组成的矩阵,如果矩阵的每一行和每一列的1的数量都是偶数,则认为符合条件。
你的任务就是检测矩阵是否符合条件,或者在仅改变一个矩阵元素的情况下能否符合条件。
"改变矩阵元素"的操作定义为0变成1或者1变成0。

输入

输入n + 1行,第1行为矩阵的大小n(0 < n < 100),以下n行为矩阵的每一行的元素,元素之间以一个空格分开。

输出

如果矩阵符合条件,则输出OK;
如果矩阵仅改变一个矩阵元素就能符合条件,则输出需要改变的元素所在的行号和列号,以一个空格分开。
如果不符合以上两条,输出Corrupt。

样例输入

样例输入1
4
1 0 1 0
0 0 0 0
1 1 1 1
0 1 0 1

样例输入2
4
1 0 1 0
0 0 1 0
1 1 1 1
0 1 0 1

样例输入3
4
1 0 1 0
0 1 1 0
1 1 1 1
0 1 0 1

样例输出

样例输出1
OK

样例输出2
2 3

样例输出3
Corrupt
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int r[102]={0},c[102]={0};
int row=0,cow=0;
int arr[102][102]={0};
int compare(int n)        //用来判断矩阵的每一行和每一列的1的数量都是否是偶数
{
	int i,j;
	for (i=0;i<n;i++)
	{
		row=0;
		cow=0;
		for (j=0;j<n;j++)
		{
			if (arr[i][j]==1)
			row+=arr[i][j];
			if (arr[j][i]==1)
			cow+=arr[j][i];
		}
		if (row%2!=0||cow%2!=0)
		{
			return -1;
		}
	}
	return 1;	
}    //这种方式判断比较好想,但是做了很多重复的判断,效率不高
int main()
{
	int n;
	int h,k;
	scanf("%d",&n);
	int flag=1,flag1=-1;//flag用于判断是否初始矩阵是否合格
	for (h=0;h<n;h++)
	{
		for (k=0;k<n;k++)
		{
			scanf("%d",&arr[h][k]);
		}
	 } 
	 if (flag=compare(n)==-1)
	 {
	 	for (h=0;h<n;h++)
		{
			for (k=0;k<n;k++)
			{
				flag1=-1;    //flag1用于判断是否改变数值后矩阵是否合格
				arr[h][k]=1-arr[h][k];//"改变矩阵元素"0变成1或者1变成0
				flag1=compare(n);
				if (flag1==1)//合格的话就输出行和列
				{
					printf("%d %d",h+1,k+1);
					return 0;
				}
				arr[h][k]=1-arr[h][k];  //不合格的话将变化的元素变回去
				
			}
		}
		if (flag1==-1)//每个数据都测试之后,如果没有符合条件的输出Corrupt
		{
			printf("Corrupt");
			return 0;
			}	
	 }
	 else if (flag=compare(n)==1)
	 	printf("OK");
	return 0;
}

这里有一点我不是很明白:(有哪位大佬给解释一下不,蟹蟹)

flag1=compare(n);
if (flag1==1)
{
	printf("%d %d",h+1,k+1);
	return 0;
}
//这样做的话是AC,10分			

 然而

if (flag1=compare(n)==1)
{
	printf("%d %d",h+1,k+1);
	return 0;
}
//这就是6分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值