【洛谷 8623】[蓝桥杯 2015 省 B] 移动距离

发布时间 2023-10-26 18:58:28作者: #Cookies#

# [蓝桥杯 2015 省 B] 移动距离

## 题目描述

X 星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为 $1,2,3, \cdots $ 。

当排满一行时,从下一行相邻的楼往反方向排号。

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

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

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

## 输入格式

输入为 $3$ 个整数 $w,m,n$,空格分开,都在 $1$ 到 $10000$ 范围内。

$w$ 为排号宽度,$m,n$ 为待计算的楼号。

## 输出格式

要求输出一个整数,表示 $m$ 与 $n$ 两楼间最短移动距离。

## 样例 #1

### 样例输入 #1

```
6 8 2
```

### 样例输出 #1

```
4
```

## 样例 #2

### 样例输入 #2

```
4 7 20
```

### 样例输出 #2

```
5
```

## 提示

时限 1 秒, 256M。

蓝桥杯 2015 年省赛 B 组 H 题。

 

题解:模拟即可解决。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<bits/stdc++.h>
using namespace std;
int w,m,n,ans;
int main(){
    freopen("8623.in","r",stdin);
    freopen("8623.out","w",stdout);
    
    scanf("%d %d %d",&w,&m,&n);
    int h1=m/w;
    int h2=n/w;
    
    if(m%w==0) h1--;
    if(n%w==0) h2--;
    
    int mw=m%w;
    int nw=n%w;
    
    if(mw==0) mw=6;
    if(nw==0) nw=6;
    
    if(h1%2==0 && h2%2==0)
       ans=abs(h2-h1)+abs((mw)-(nw));
       
    if(h1%2==1 && h2%2==1)
       ans=abs(h2-h1)+abs((w-(mw)+1)-(w-(nw)+1));
       
    if(h1%2==0 && h2%2==1)
        ans=abs(h2-h1)+abs((mw)-(w-(nw)+1));  
        
    if(h1%2==1 && h2%2==0)
       ans=abs(h2-h1)+abs((w-(mw)+1)-(nw));
            
    printf("%d",ans);
    return 0;
}