#181-[二维数组+位运算卡常]错误探测

Description

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

 

Input

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

Output

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

 

HINT

对于20% 的数据,1 <= n <=10。
• 对于60% 的数据,1 <=n <=50。
• 对于100% 的数据,1 <= n <=100。

Source/Category

多维数组 

卡常!卡常!卡常!

计算机最不怕的就是卡常。你让它卡1500000000次都不怕,但是让它卡15000000000000000次的话......

 

#include <iostream>
#include <cstdio>

#define SIZE 110

using namespace std;

int r[SIZE], c[SIZE];

int main(void)
{
	int n, i, j, x, indexx = 0, indexy = 0;
	
	scanf("%d", &n);
	for (i = 1; i <= n; ++i)
	{
		for (j = 1; j <= n; ++j)
		{
			scanf("%d", &x);
			if (x)
			{
				r[i] ^= 1; // 异或卡常
				c[j] ^= 1;
			}
		}
	}
	
	for (i = 1; i <= n; ++i) // 探测!是否存在错误?
	{
		if (r[i]) // 什么?这行不行?错误行数是否被记录过?
		{
			if (indexx) // 什么?被记录过?
			{
				printf("Corrupt"); // 一次改变不了!
				return 0;
			}
			indexx = i; // 记录错误行
		}
		if (c[i]) // 什么>这列不行?错误列数是否被记录?
		{
			if (indexy) // 什么?被记录过?
			{
				printf("Corrupt"); // 一次改变不了!
				return 0;
			}
			indexy = i; // 记录错误列
		}
	}
	
	if ((indexx) || (indexy)) // 有错误!
	{
		printf("%d %d", indexx, indexy); // 输出要改变的
	}
	else // 什么?没问题?
	{
		printf("OK"); // OK!全部正确! 
	}
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值