蓝桥杯 移动距离 python
题目
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
资源约定
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
思路
我有两种思路,第一种就是模拟了,就模拟这个矩阵,然后找到这两个位置,这样的方法,当我们的数据量很大的时候,相差很大的时候,我们需要大量的时间和内存模拟这个矩阵,花费了很多时间,但是这样好像也是能够得到结果的。
第二种思路就是找规律,对我们的矩阵,实际上距离就是|y1-y2|+|x1-x2|就得到了,所以首先我们需要得到我们的坐标,我发现一般来说n//w就是行数,但是也有例外,就是n%w为0的时候,所以这种情况要特判。除此之外呢,就是对于行数为奇数的情况也需要进行判断,因为这个时候是反过来的,就需要w-1-n%w得到我们的结果。
接下来就看看代码吧
模拟
w, m, n = map(int,input().split()) y = max(m,n)//w + 1 matrix = [] res = [] for i in range(y): temp = [j for j in range(w*i+1, w*(i+1)+1)] if i%2 == 0: matrix.append(temp) else: temp = temp[::-1] matrix.append(temp) if m in temp: res.append([temp.index(m),i]) if n in temp: res.append([temp.index(n),i]) print(abs(res[0][1]-res[1][1]) + abs(res[0][0]-res[1][0]))
找规律
w,m,n = map(int,input().split()) x1,y1 = m//w,m%w x2,y2 = n//w,n%w def change(x,y): if y == 0: x -= 1 if x%2 == 1 and y == 0: # 奇数 y = 0 elif x%2 == 1: y = w - y elif y==0: y = w - 1 else: y = y - 1 return x,y x1,y1 = change(x1, y1) x2,y2 = change(x2, y2) print(abs(x1-x2) + abs(y1-y2))