移动距离

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范围内
要求输出一个整数,表示m n 两楼间最短移动距离。

例如:
用户输入:
6 8 2
则,程序应该输出:
4

再例如:
用户输入:
4 7 20
则,程序应该输出:
5

#include <iostream>
using namespace std;
//abs	:	返回 x 的绝对值 
int abs(int x){
	return x>0?x:-x;
}
int main(){
	//w		:	小区排号宽度  
	//m,n		:	两个楼号 
	//x1,x2,y1,y2	:	要求出的两个楼号的横纵坐标
	//count		:	最短距离 
	int w=0,m=0,n=0;
	int x1,x2,y1,y2,count=0; 
	
	cin>>w>>m>>n;
	m-=1;n-=1;//因为楼号从“1”开始 所以减 1 
	
	x1=m/w;//求出第几行 从 0 开始 
	y1=(x1%2==0)?(m%w):(w-m%w-1);//求出第几列 从 0 开始 奇偶行的列数方向不同 
	
	x2=n/w;
	y2=(x2%2==0)?(n%w):(w-n%w-1);
	
	count = abs(x1-x2)+abs(y1-y2);//边长减边长的和 
	cout<<count;	 
} 

以满足以上两组数据要求

类似文章