2015年第六届蓝桥杯 - 省赛 - C/C++大学B组 - H.移动距离

移动距离

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;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值