蓝桥杯国赛【机器人行走】 Python

简介: 蓝桥杯国赛【机器人行走】 Python

f8fa652ccd0b4f7abf21609e100c13f5.png

题目描述精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课


(可以在蓝桥云客里面找到这个题,也可以去蓝桥杯官网里的练习系统)


某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有 3 种:左转(记为 L),右转(记为 R),向前走若干厘米(直接记数字)。


例如,我们可以对小车输入如下的指令:


15L10R5LRR10R20


则,小车先直行 15 厘米,左转,再走 10 厘米,再右转,


不难看出,对于此指令串,小车又回到了出发地。


你的任务是:编写程序,由用户输入指令,程序输出每条指令执行后小车位置与指令执行前小车位置的直线距离。


输入描述

用户先输入一个整数 n(n<100)n (n<100),表示接下来将有 n 条指令。


接下来输入 n 条指令。每条指令只由 L、R 和数字组成(数字是 0 ~ 100 之间的整数)


每条指令的长度不超过 256 个字符。


输出描述

程序则输出 nn 行结果,每条结果表示小车执行相应的指令前后位置的直线距离。要求四舍五入到小数后 2 位。


输入输出样例


291c938e01e643a496e95a1307299cb7.png


问题分析:首先作为一道决赛题 是需要静下心来好好分析。


题目的意思是,给出n道指令,输出执行相邻指令,两点之间的距离


比如第一次的指令是p,第二次的指令是q,第三次....


那我们第一行要输出的就是经过第一次指令后,得到的点和原点的距离


那我们第二行要输出的就是在经过第一次指令的基础上,接着执行第二次指令,得到的点和上一轮得到的点的距离....


所以,我们只要知道经过i次指令后的坐标和经过i-1次指令的坐标,就可以得到如题目所说的每条指令执行后小车位置与指令执行前小车位置的直线距离。


那么该如何求经过i次指令后点的坐标呢?显然,我们如果把第1次指令,第2次指令..一直到第i次指令都合并起来,即让原点一次性执行这么多次(i次)指令,就可以得到坐标啦。


那么该如何合并?由于题目给出的是第i次指令的内容,所以我们需要用到前缀和。


z[i]代表第1次到第i次所有操作


接下来就是要根据z[i],得到经过i次操作后,点的坐标


如果得到了每个点的坐标,将他们存入数组c[i]


相邻点的距离就是所求,依次输出即可。


下面问题缩小到,如何根据z[i],得到经过i次操作后,点的坐标


下面的l,r,u,d分别代表(left左,right右,up上,down下)


用于朝向不同,经过l,r,u,d后来的朝向就不确定


我们不妨用数字替代l,r,u,d,分别用0,1,2,3


数组toward[i][j]=[#四个数字]:代表以i为朝向经过j的转弯的新朝向


dir标记当前朝向,与toward有关,当碰到'L'或'R',更新dir


当碰到数字,存入distance数组,append进去


distance[i]:代表i方向上操作的过程


详细点说:初始化distance=[[],[],[],[]],比如我当前朝向是1(right),碰到数字了,那么在distance[1]的数组里面append这个数字


到最后,我们就得到了这个点在四个方向上变化的总距离(对distance[i]求和,其求和结果就是在i方向上增加的距离)


最后根据距离公式得到dx=(sum(distance[#右]-distance[#左]))


dy同理


存入c[i],然后对c[i]按照上面说的操作就好了

n=int(input())
s=[]
z=[0]*n
def trans(x):#分割字符串L100R50R10变成['L','100','R'....]'
    t=[]
    s=''
    for i in x:
        if i.isalpha():
            if s:t.append(s)
            t.append(i)
            s=''
        else:
            s+=i
    if s:t.append(s)
    return t
for i in range(n):
    s.append(trans(input()))
z[0]=s[0]#前缀和(合并)
for i in range(1,n):
    z[i]=z[i-1]+s[i]
cns=[[0,0]]
#cns存每次命令过后的坐标,cns[i]代表经过i次命令后的坐标
def cal(j):
    global cns#开始方向
    distance=[[],[],[],[]]#左右,上下
    #l,r,u,d对应数字为0,1,2,3
    toward=[[3,2,0,0],[2,3,1,1],[0,1,2,2],[1,0,3,3]]
    dir=2
    for i in j:
        if i.isdigit():
            distance[dir].append(int(i))
        else:
            if i=='L':
                dir=toward[dir][0]
            else:
                dir=toward[dir][1]
    dx=sum(distance[1])-sum(distance[0])#右为正,左为负
    dy=sum(distance[2])-sum(distance[3])#上为正,下为负
    cns.append([dx,dy])
for j in z:
    cal(j)#调用函数 存坐标
for i in range(1,len(cns)):
    px=(cns[i][0]-cns[i-1][0])**2
    py=(cns[i][1]-cns[i-1][1])**2
    print('%.2f'%(px+py)**0.5)#输出两点间距离


相关文章
|
4月前
|
传感器 机器人 定位技术
Python 机器人学习手册:6~10
Python 机器人学习手册:6~10
158 0
|
4月前
|
传感器 Ubuntu 机器人
Python 机器人学习手册:1~5
Python 机器人学习手册:1~5
239 0
|
3月前
|
存储 机器学习/深度学习 算法
第十五届蓝桥杯pb组国赛E题[马与象] (15分)BFS算法 详解
第十五届蓝桥杯pb组国赛E题[马与象] (15分)BFS算法 详解
34 3
|
1月前
|
算法 Ubuntu 机器人
DRAKE - 基于模型的机器人设计与验证 由丰田研究所支持的 C++ / Python 工具箱。
DRAKE - 基于模型的机器人设计与验证 由丰田研究所支持的 C++ / Python 工具箱。
43 1
|
1月前
|
机器学习/深度学习 算法 机器人
【2023年第十三届APMCM亚太地区大学生数学建模竞赛】A题 水果采摘机器人的图像识别 Python代码解析
本文介绍了2023年第十三届APMCM亚太地区大学生数学建模竞赛A题的Python代码实现,详细阐述了水果采摘机器人图像识别问题的分析与解决策略,包括图像特征提取、数学模型建立、目标检测算法使用,以及苹果数量统计、位置估计、成熟度评估和质量估计等任务的编程实践。
45 0
【2023年第十三届APMCM亚太地区大学生数学建模竞赛】A题 水果采摘机器人的图像识别 Python代码解析
|
3月前
|
存储 算法 测试技术
第十五届蓝桥杯大赛 国赛 pb组F题【括号与字母】(15分) 栈的应用
第十五届蓝桥杯大赛 国赛 pb组F题【括号与字母】(15分) 栈的应用
23 1
|
3月前
|
Java
2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟
2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟
41 4
|
3月前
|
Java
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
34 3
|
3月前
|
Java
2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
39 2
|
3月前
|
Java
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
27 1