蓝桥杯 移动距离 python
Posted 风信子的猫Redamancy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯 移动距离 python相关的知识,希望对你有一定的参考价值。
蓝桥杯 移动距离 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))
以上是关于蓝桥杯 移动距离 python的主要内容,如果未能解决你的问题,请参考以下文章