蓝桥杯 移动距离 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的主要内容,如果未能解决你的问题,请参考以下文章

移动的距离 --- 蓝桥杯

蓝桥杯真题3

LQ0024 移动距离数学

移动距离

小学生蓝桥杯Python闯关 | 移动方格

蓝桥杯省赛真题12Scratch排序 少儿编程scratch蓝桥杯省赛真题讲解