Link
ZOJ - http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4941
Description
给你一个
L
×
W
×
H
L\times W\times H
L×W×H 的长方体。它由
L
×
W
×
H
L\times W\times H
L×W×H 个小正方体组成。
1
≤
L
,
W
,
H
≤
4
1\le L,W,H\le 4
1≤L,W,H≤4
每个小正方体自带一个数字
0
≤
x
≤
100
0\le x\le100
0≤x≤100 ,相邻两个小正方体可以同时减去或加上任意一个整数任意次。
求是否可以使所有立方体上的数为零。
Analysis
也就是说一共要减去
∑
v
a
l
\sum val
∑val
不难发现完全可以把一半格子里的数清空,挪到相邻格子里边
然后长方体从某一维看过去变成
没有 | 有 | 没有 | 有 |
没有 | 有 | 没有 | 有 |
没有 | 有 | 没有 | 有 |
没有 | 有 | 没有 | 有 |
这样的感觉
你可以继续挪 继续挪 最后就剩下一个点 必须为
0
0
0
这是什么意思呢 所有
x
+
y
+
z
x+y+z
x+y+z 为奇数的格子权值和必须等于所有
x
+
y
+
z
x+y+z
x+y+z 为偶数的格子的权值和。
你只要考虑一个格子的权值被挪之后在另外某个格子里面只会产生正或者负的原来权值的贡献
就不难意会辣。
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<vector>
#include<algorithm>
using namespace std;
#define R register
int L, W, H, Ans[2];
int main()
{
while (~scanf("%d%d%d", &L, &W, &H))
{
Ans[0] = Ans[1] = 0;
for (R int t, i = 1; i <= L; ++i)
{
for (R int j = 1; j <= W; ++j)
{
for (R int k = 1; k <= H; ++k)
{
scanf("%d", &t);
Ans[(i+j+k)&1] += t;
}
}
}
puts(Ans[0]==Ans[1]?"Yes":"No");
}
return 0;
}