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

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 1048576K,其他语言2097152K
64bit IO Format: %lld

题目描述

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

输入描述

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

输出描述

仅一个整数表示答案。

输入

3
1 2 1
0 -1 0
0 1 0

输出

1

解题思路

 如图,AB,CD在同一行,AC,BD在同一列。

假如AB这一行加x,CD这一行加y,AC这一列加p,BD这一列加q。

那么A加了x+p,B加了x+q,c加了y+p,d加了y+q。

很容易发现AB之差等于CD之差。

所以我们现在已经知道了其中的三个,求另外一个也是很简单的事情。

#include <stdio.h>
int n, m, x, y, map[1010][1010];
int main()
{
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			scanf("%d", &map[i][j]);
			if (map[i][j] < 0)
				x = i, y = j;
		}
	}
	if (!x && !y)
		m = map[x + 1][y] - map[x + 1][y + 1] + map[x][y + 1];
	else if (!x && y)
		m = map[x + 1][y] - map[x + 1][y - 1] + map[x][y - 1];
	else if (x && !y)
		m = map[x - 1][y] - map[x - 1][y + 1] + map[x][y + 1];
	else m = map[x - 1][y] - map[x - 1][y - 1] + map[x][y - 1];
	printf("%d\n", m);
	return 0;
}