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