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

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

image.png

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

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

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


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


15L10R5LRR10R20


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


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


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


输入描述


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


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


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


输出描述


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


输入输出样例


image.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)#输出两点间距离
目录
相关文章
|
7月前
|
人工智能 自然语言处理 机器人
探索人工智能:使用Python构建一个简单的聊天机器人
探索人工智能:使用Python构建一个简单的聊天机器人
330 0
|
7月前
|
传感器 机器人 定位技术
Python 机器人学习手册:6~10
Python 机器人学习手册:6~10
266 0
|
2月前
|
Python
蓝桥杯练习题(一):Python组之入门训练题
这篇文章是关于蓝桥杯Python组的入门训练题,包括Fibonacci数列、圆的面积、序列求和和A+B问题的具体代码实现和样例输出。
149 0
|
2月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
128 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
2月前
|
人工智能 Python
蓝桥杯练习题(四):Python组之历届试题三十题
关于蓝桥杯Python组历届试题的三十个练习题的总结,包括题目描述、输入输出格式、样例输入输出以及部分题目的解题思路和代码实现。
50 0
蓝桥杯练习题(四):Python组之历届试题三十题
|
2月前
|
JSON 机器人 API
详解如何使用 Python 操作 Telegram(电报)机器人(一)
详解如何使用 Python 操作 Telegram(电报)机器人(一)
441 8
|
2月前
|
机器人 数据库 Python
详解如何使用 Python 操作 Telegram(电报)机器人(二)
详解如何使用 Python 操作 Telegram(电报)机器人(二)
199 2
|
2月前
|
人工智能 自然语言处理 机器人
用Python构建你的第一个聊天机器人
【10月更文挑战第7天】在这篇文章中,我们将一起探索如何利用Python编程语言和AI技术,一步步打造一个基础的聊天机器人。无论你是编程新手还是有一定经验的开发者,都能通过这个指南获得启发,并实现一个简单的对话系统。文章将引导你理解聊天机器人的工作原理,教你如何收集和处理用户输入,以及如何设计机器人的响应逻辑。通过动手实践,你不仅能够学习到编程技能,还能深入理解人工智能在语言处理方面的应用。
115 0
|
2月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(二):Python组之基础练习三十题
蓝桥杯Python编程练习题的集合,包含了三十个不同难度的编程题目,覆盖了基础语法、数据结构和算法等领域。
53 0
|
4月前
|
机器学习/深度学习 算法 机器人
使用Python实现深度学习模型:智能灾害响应与救援机器人
使用Python实现深度学习模型:智能灾害响应与救援机器人
89 16