移动距离

移动距离

题目描述

在这里插入图片描述


核心思路

这题其实就是想让我们求出编号为 m m m的楼房与编号为 n n n的楼房的曼哈顿距离。设编号为 m m m的楼房的二维坐标是 ( x 1 , y 1 ) (x_1,y_1) (x1,y1),编号为 n n n的楼房的二维坐标是 ( x 2 , y 2 ) (x_2,y_2) (x2,y2),那么曼哈顿距离为 ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ |x_1-x_2|+|y_1-y_2| x1x2+y1y2

因为楼房的编号从1,开始,但是为了适应二维数组,为了更方便的求出某个编号楼房的坐标,我们先让楼房的编号都减去1。拿样例来解释,如果楼房的编号从1开始,那么编号为2的坐标是 ( 1 , 2 ) (1,2) (1,2),编号为8的坐标为 ( 2 , 5 ) (2,5) (2,5),因此曼哈顿距离就是 ∣ 1 − 2 ∣ + ∣ 2 − 5 ∣ = 4 |1-2|+|2-5|=4 12+25=4;如果让楼房的编号从0开始,那么编号为2的坐标是 ( 0 , 1 ) (0,1) (0,1),编号为8的坐标为 ( 1 , 4 ) (1,4) (1,4),因此曼哈顿距离就是 ∣ 0 − 1 ∣ + ∣ 1 − 4 ∣ = 4 |0-1|+|1-4|=4 01+14=4,可以知道,编号减去1后结果仍然不变,但是会结合二维数组会更好的求出行号和列号。

问题:如何求出某个点的行号,也就是横坐标呢?

在这里插入图片描述

问题:如何求出某个点的列号,也就是纵坐标呢?

在这里插入图片描述

解决了行号和列号的问题,那么就可以很方便地求出了某个点的坐标了。总之这里用到的技巧就是:把楼房编号减去1,这样就符合了C++二维数组的顺序,那么就很方便容易地求出了某个点的坐标了。


代码

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int w,n,m;
    scanf("%d%d%d",&w,&m,&n);
    m--,n--;        //让楼房的编号都减去1
    int x1=m/w;     //求出楼房m的行号
    int x2=n/w;     //求出楼房n的行号
    int y1=m%w;     //求出楼房m的列号
    int y2=n%w;     //求出楼房n的列号
    //如果是x1奇数行,说明列号需要翻转
    if(x1&1)
        y1=w-y1-1;
    //如果是x2奇数行,说明列号需要翻转
    if(x2&1)
        y2=w-y2-1;
    printf("%d\n",abs(x1-x2)+abs(y1-y2));
    return 0;
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卷心菜不卷Iris

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

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

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

打赏作者

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

抵扣说明:

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

余额充值