链接: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;
}