模拟-第六届蓝桥杯省赛C++B组-移动距离

模拟-第六届蓝桥杯省赛C++B组-移动距离

题目:

X星球居民小区的楼房全是一样的,并且按矩阵样式排列。

其楼房的编号为 1,2,3…
当排满一行时,从下一行相邻的楼往反方向排号。

比如:当小区排号宽度为 6 时,开始情形如下:

  1     2     3    4   5   6 \ 1\ \ \ 2 \ \ \ 3 \ \ 4 \ 5\ 6  1   2   3  4 5 6
12   11   10   9   8   7 12 \ 11 \ 10\ 9\ 8\ 7 12 11 10 9 8 7
13   14   15..... 13 \ 14\ 15 ..... 13 14 15.....

我们的问题是:已知了两个楼号 m 和 n,需要求出它们之间的最短移动距离(不能斜线方向移动)。

输入格式
输入共一行,包含三个整数 w,m,n,w 为排号宽度,m,n 为待计算的楼号。

输出格式
输出一个整数,表示 m,n 两楼间最短移动距离。

数据范围
1≤w,m,n≤10000,

输入样例:
6 8 2
输出样例:
4

题解:

将 所 有 数 减 1 , 数 据 从 0 开 始 递 增 , 则 二 维 数 组 中 的 任 意 元 素 a [ i ] [ j ] 所 在 的 行 号 x = ⌊ a [ i ] [ j ] w ⌋ , 将所有数减1,数据从0开始递增,则二维数组中的任意元素a[i][j]所在的行号x=\lfloor\frac{a[i][j]}{w}\rfloor, 10a[i][j]x=wa[i][j]

若 序 列 是 按 照 正 常 二 维 数 组 排 列 顺 序 进 行 排 列 的 , 列 号 y = a [ i ] [ j ] % w , 若 逆 序 排 列 , 列 号 y ′ = w − 1 − y 。 若序列是按照正常二维数组排列顺序进行排列的,列号y=a[i][j]\%w,若逆序排列,列号y'=w-1-y。 y=a[i][j]%w,y=w1y

因 此 对 奇 数 行 的 列 号 特 判 即 可 。 因此对奇数行的列号特判即可。

补 充 : 补充:

对 平 面 坐 标 系 中 任 意 两 点 ( x 1 , y 1 ) , ( x 2 , y 2 ) 对平面坐标系中任意两点(x_1,y_1),(x_2,y_2) (x1,y1),(x2,y2)

① 、 曼 哈 顿 距 离 = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ 。 ①、曼哈顿距离=|x_1-x_2|+|y_1-y_2|。 =x1x2+y1y2

② 、 欧 几 里 得 距 离 = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 ②、欧几里得距离=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2} =(x1x2)2+(y1y2)2


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<sstream>
#define ll long long
#define inf 0x7fffffff
using namespace std;

int main()
{
    int w,m,n;
    cin>>w>>m>>n;
    m--,n--;
    int x1=m/w,x2=n/w;
    int y1=m%w,y2=n%w;

    if(x1%2) y1=w-1-y1;
    if(x2%2) y2=w-1-y2;

    cout<<abs(x2-x1)+abs(y2-y1)<<endl;

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值