当前位置: 首页 > news >正文

P8623 [蓝桥杯 2015 省 B] 移动距离 Python

[蓝桥杯 2015 省 B] 移动距离

题目描述

X 星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为 $1,2,3, \cdots $ 。

当排满一行时,从下一行相邻的楼往反方向排号。

比如:当小区排号宽度为 6 6 6 时,开始情形如下:

1  2  3  4  5  6
12 11 10 9  8  7
13 14 15 .....

我们的问题是:已知了两个楼号 m m m n n n,需要求出它们之间的最短移动距离。(不能斜线方向移动)

输入格式

输入为 3 3 3 个整数 w , m , n w,m,n w,m,n,空格分开,都在 1 1 1 10000 10000 10000 范围内。

w w w 为排号宽度, m , n m,n m,n 为待计算的楼号。

输出格式

要求输出一个整数,表示 m m m n n n 两楼间最短移动距离。

样例 #1

样例输入 #1

6 8 2

样例输出 #1

4

样例 #2

样例输入 #2

4 7 20

样例输出 #2

5

提示

时限 1 秒, 256M。

蓝桥杯 2015 年省赛 B 组 H 题。

思路

先明白题意,其实就是找矩阵中怎么从一个点移动到另一个点,求总的步数。
再看下面这个图片,题目指定的楼号其实就是序号,如果按这样构造的矩阵,看 8 到 2 的距离的话**,
本质上是 8 的坐标 - 2 的坐标求和**
8(1,4) 2(0,1) (1-0) + (4-1)=4
在这里插入图片描述
这个肯定是二维数组,在二维数组中,每个元素都有自己的坐标,在给数组赋值时,其实就可以判断此时的序号是不是等于等会要判断的楼号,如果相等的话,就保存下坐标,当给定的两个坐标都知道时,就不必再继续赋值,直接退出循环,计算数值。

#创建一个w*10010的矩阵 ,每个位置为0

a = [[0]*w for i in range(10010)]

#在矩阵中,坐标的移动方向

dirction = [(0,1),(1,0),(0,-1),(1,0)]#右 下 左 下

#处理移动的逻辑 往右到头就去下面,往左到头继续往下走

while num<10001:#据题目知楼号在1-10000num+=1a[x][y] = numnewx = x + dirction[index][0]newy = y + dirction[index][1]if   newx<0 or newy>=6 or newy <0:index = (index+1)%4newx = x + dirction[index][0]newy = yindex = (index +1)%4x = newxy = newy

#判断是否等于输入的楼号

if num == m:x1,y1 = x,yind_x1 = Trueif num == n:x2,y2 = x,yind_x2= Trueif ind_x1 ==True and ind_x2 ==True:break

总代码


import math
w,m,n = map(int,input().split())
a = [[0]*w for i in range(10010)]
num=0
x,y=0,0
index= 0
x1,y1=0,0
ind_x1,ind_x2 = False,False
dirction = [(0,1),(1,0),(0,-1),(1,0)]#右 下 左 下
while num<10001:num+=1a[x][y] = numif num == m:x1,y1 = x,yind_x1 = Trueif num == n:x2,y2 = x,yind_x2= Trueif ind_x1 ==True and ind_x2 ==True:breaknewx = x + dirction[index][0]newy = y + dirction[index][1]if   newx<0 or newy>=w or newy <0:index = (index+1)%4# print("index_f",index)newx = x + dirction[index][0]newy = yindex = (index +1)%4# print("index_l",index)x = newxy = newy# print("value_x,value_y",x,y)
# for i in a:
#     for num in i:
#         print(f"{num:3d}",end="")     
#     print()
# print(x1,y1)
# print(x2,y2)
ans = abs(x1-x2) + abs (y1-y2)
print(ans)
http://www.lryc.cn/news/326287.html

相关文章:

  • 【Python】学习率调整策略详解和示例
  • 【Linux实践室】Linux用户管理实战指南:用户密码管理操作详解
  • UE5学习日记——蓝图节点前缀关键字整理
  • 浅析机器学习的常用方法
  • 大数据开发(日志离线分析项目)
  • PostgreSQL技术大讲堂 - 第48讲:PG高可用实现keepalived
  • 【若依 SpringBoot 前后端分离版】修改加密传输后密码错误的解决方法(附排错过程)
  • 发送请求- header配置
  • C语言重难知识点
  • jMeter学习
  • Nodejs运行vue项目时,报错:Error: error:0308010C:digital envelope routines::unsupported
  • 华为汽车图谱
  • 鸿蒙操作系统-初识
  • 【ZZULIOJ】1003: 两个整数的四则运算(Java)
  • 聊聊芯片原厂
  • 百人一岗,Android开发者的困境。。。。。
  • 若依分离版 —引入echart连接Springboot后端
  • Halcon深度学习项目实战
  • 子类中的方法去调用父类中的方法有几种形式?原生django如何向响应头写入数据
  • 数据安全治理框架构建
  • 深度学习十大算法之图神经网络(GNN)
  • 【工具类】git log 常用别名,git log 干活,git log常用参数
  • [linux] AttributeError: module ‘transformer_engine‘ has no attribute ‘pytorch‘
  • 前端面试题---->JavaScript
  • spring 的理解
  • 【Java程序设计】【C00384】基于(JavaWeb)Springboot的民航网上订票系统(有论文)
  • 如何查看局域网内所有的ip和对应的mac地址
  • 应用层协议 - HTTP
  • mysql安装及操作
  • 【计算机操作系统】深入探究CPU,PCB和进程工作原理