前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OJ刷题记录:问题 A: 蓝桥杯(C/C++组)2015-8 移动距离

OJ刷题记录:问题 A: 蓝桥杯(C/C++组)2015-8 移动距离

作者头像
英雄爱吃土豆片
发布2020-10-29 11:02:08
4360
发布2020-10-29 11:02:08
举报
文章被收录于专栏:英雄爱吃土豆片

问题 A: 蓝桥杯(C/C++组)2015-8 移动距离

题目要求: 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 两楼间最短移动距离。

样例输入 Copy 6 8 2 样例输出 Copy 4

解题思路: 根据题目的描述,我们可知 X 星球的居民小区排列成一个以 w 为列的矩阵,要求两个楼房间的最短路径,即求矩阵中的两点之间的最短路径,而矩阵中的两点围成的矩形的长宽和就是两点之间的最短路径,在不确定两个点的位置的情况下,我们分别取两个点的横纵坐标差的绝对值,相加,便是两点之间的最短路径。 本题关键点在于这个矩阵的偶数行(假设矩阵的第一行下标为 1 ),按照题目要求,矩阵偶数行的元素次序是正常数字顺序的逆序。我们需要在取列坐标 y 时进行另外的判断和转换。

以下代码有些冗长,可以写得更精简。

通关代码:

代码语言:javascript
复制
#include <iostream>
#include <algorithm>

using namespace std;

struct Pos {
	int _x;
	int _y;
	Pos(int x, int y):_x(x), _y(y) {}
};

Pos getPos(int w, int num) {
	int x, y;
	
	if (num % w == 0) {
		x = num / w;
	} else {
		x = (num + w) / w;
	}
	
	if (x % 2 == 0) {
		y = w - (num % w) + 1;
	} else {
		y = num % w ? num % w : w;
	}
	
	return Pos(x, y);
}

int main() {
	int w, m, n, res;
	
	cin >> w >> m >> n;
	
	Pos M = getPos(w, m);
	Pos N = getPos(w, n);
	
	res = abs(M._x - N._x) + abs(M._y - N._y);
	
	cout << res;
	
	return 0;
}

毕。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题 A: 蓝桥杯(C/C++组)2015-8 移动距离
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档