移动距离
X星球居民小区的楼房全是一样的,并且按矩阵样式排列。
其楼房的编号为1,2,3…
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为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 两楼间最短移动距离。
例如:
用户输入:
6 8 2
则,程序应该输出:
4
再例如:
用户输入:
4 7 20
则,程序应该输出:
5
code
#include<iostream>
#include<cmath>
using namespace std;
//赋予楼号横坐标和纵坐标,最短距离就是横坐标的绝对值加上纵坐标的绝对值
int main()
{
//输入排号宽度和两个楼号
int w,m,n;
cin >> w >> m >> n;
//定义楼号的横坐标和纵坐标
int x_m,x_n;
int y_m,y_n;
//计算纵坐标
//两侧的计算方法和中间的计算方法不一样
if(m % w){
y_m = m / w + 1;//中间楼号
}
else{
y_m = m / w;//两侧楼号
}
if(n % w){
y_n = n / w + 1;
}
else{
y_n = n / w;
}
//计算横坐标
//顺序排列和逆序排列计算方法不同
if(y_m % 2 == 0){
x_m = y_m * w - m + 1;//逆序
}
else
{
x_m = m - ((y_m - 1) * w);//顺序
}
if(y_n % 2 == 0){
x_n = y_n * w - n + 1;
}
else
{
x_n = n - ((y_n - 1) * w);
}
int ans;
ans = abs(y_m - y_n) + abs(x_n - x_m);
cout << ans;
return 0;
}