链接:https://www.nowcoder.com/acm/contest/206/B
来源:牛客网

题目描述

恬恬有一个nx n的数组。她在用这个数组玩游戏:
开始时,数组中每一个元素都是0。
恬恬会做某些操作。在一次操作中,她可以将某一行的所有元素同时加上一个值,也可以将某一列的所有元素同时加上一个值。
在几次操作后,一个元素被隐藏了。你能帮助她回忆隐藏的数是几吗?

输入描述:

第一行一个整数n(1≤ n≤ 1000)。
接下来n行每行n个整数表示数组a。
第(i+1)行的第j个元素表示aij(aij=-1或0≤ aij ≤ 10000)。-1表示隐藏的元素。

输出描述:

仅一个整数表示答案。

示例1

输入

3
1 2 1
0 -1 0
0 1 0

输出

1

解题思路

大佬是真的牛逼,染色思想是真的妙啊,妙不可言。
假设二维数组每一块的颜色为(i+j)%n i 和 j 从0开始 ,然后每种颜色的块的和就会相等!!!显示这个结论成立,然后统计一下和的差值就切了。。。

AC代码

#include <iostream>
using namespace std;
int a[1005][1005];
int main()
{
	int n, f = 0, ff;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			scanf("%d", &a[i][j]);
			if (a[i][j] == -1)
			{
				a[i][j] = 0;
				ff = (i + j) % n;
				if (ff == 0)
					f = 1;
			}
		}
	}
	int ans = 0, cnt = 0;
	for (int i =0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if ((i + j) % n == f)
				ans += a[i][j];
			if ((i + j) % n == ff)
				cnt += a[i][j];
		}
	}
	printf("%d\n", ans - cnt);
}