题目来源
学军OJ,题号1179,链接http://dev.xjoi.net/problem/1179。
也可以到http://47.110.135.197/problem.php?id=5069。
题面
小蓝准备去和小红约会,小蓝和小红居住在一个平面直角坐标系中,小蓝的家在(0,0)位置,小红的家在(a,b)位置,小蓝每一步可以往上下左右中的任意一个方向移动一个单位,换句话说,他可以从(x,y)走 到(x+ 1,y), (x- 1,y), (x,y+ 1), (x,y- 1)中的一个位置。
不幸的是小蓝的方向感比较差,所以他每次随机选择了一个方向走出去,有时候可能走着走着走回了自己的家,有时候可能已经走到了小红的家还没有发现,又继续走。
幸运的是,在一个夜黑风高的夜晚,他终于走到了小红的家,他高兴地跟小红说,从我家到你家我走了step步,现在你帮帮小红计算一下,从小蓝的家走到小红的家有没有可能走step步。
输入格式
输入一行,包含三个整数,a,b,step。
输出格式
输出一行,如果可能输出“Yes”,否则输出“No”。
样例输入
0 1 3
样例输出
Yes
题目分析
我一看到题目的第一反应,就是本题考DFS。学军中学果然牛,一级四段的题目就能涉及DFS,然后开始仔细读题目。题目读完后,发现不是DFS,因为没有说到每个地方只能走一次。核心就在这里。每个地方可以任意走。所以只是简单的判断。
我们简单分析一下题目:1、目的地点永远是(0,0)。2、给定开始地点和步数。本题就是考察开始地点到(0,0)的距离和步数的关系。每次移动的方法是上下左右中的任意一个方向移动一个单位,因此我们可以知道从开始地点到(0,0)的最短步数应该是 (a-0)+(b-0) 也就是 a+b。下面我们来讨论一下 a+b 和step的关系:
(1)a+b > step。那么显然是不可能完成的任务。
(2)a+b == step。正好是最小步数。
(3)a+b < step。这里要仔细分析,可以发现最终 (step - a - b) 如果是偶数,肯定是可以走到。如果是奇数,肯定走不到。具体可以画图得出。
本题坑点
仔细阅读题目,会发现 a 和 b 可能是负数,负数,负数。所以计算的时候要注意负数处理。
AC代码
//约会
//http://dev.xjoi.net/problem/1179
#include <cstdio>
int main() {
int a, b, step;
scanf("%d %d %d", &a, &b, &step);
if (a<0) {
a = 0-a;
}
if (b<0) {
b = 0-b;
}
int c = a+b;
if (c>step) {
printf("No\n");
} else if (c==step) {
printf("Yes\n");
} else {
if (0==(step-c)%2) {
printf("Yes\n");
} else {
printf("No\n");
}
}
return 0;
}