【洛谷 8623】[蓝桥杯 2015 省 B] 移动距离
# [蓝桥杯 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; }