学军OJ题解——1179 约会

本文解析了一个关于平面坐标系中从起点到终点是否能在指定步数内到达的问题,通过分析距离和步数之间的关系,提出了一个简易的判断方法,并附上了AC代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源

学军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;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的老周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值