蓝桥杯国赛【机器人行走】 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)#输出两点间距离
目录
相关文章
|
4月前
|
人工智能 自然语言处理 机器人
探索人工智能:使用Python构建一个简单的聊天机器人
探索人工智能:使用Python构建一个简单的聊天机器人
294 0
|
4月前
|
传感器 机器人 定位技术
Python 机器人学习手册:6~10
Python 机器人学习手册:6~10
158 0
|
4月前
|
传感器 Ubuntu 机器人
Python 机器人学习手册:1~5
Python 机器人学习手册:1~5
239 0
|
26天前
|
机器学习/深度学习 算法 机器人
使用Python实现深度学习模型:智能灾害响应与救援机器人
使用Python实现深度学习模型:智能灾害响应与救援机器人
53 16
|
20天前
|
机器学习/深度学习 人工智能 算法
用Python实现简单的聊天机器人
【8月更文挑战第31天】 本文将介绍如何使用Python语言和AIML库来实现一个简单的聊天机器人。我们将从基本的安装和配置开始,然后逐步深入到聊天机器人的实现过程。最后,我们将展示如何训练我们的机器人以使其更加智能。无论你是编程新手还是有经验的开发者,都可以从本文中获得实用的知识。
|
1月前
|
监控 机器人 Java
【python】调用钉钉机器人发起通知
【python】调用钉钉机器人发起通知
|
3月前
|
机器人 API 开发者
Python基于Mirai开发的QQ机器人保姆式教程(亲测可用)
Python基于Mirai开发的QQ机器人保姆式教程(亲测可用)
|
4月前
|
自然语言处理 机器人 Python
Python实现简易聊天机器人
Python实现简易聊天机器人
67 2
|
4月前
|
JSON 网络协议 前端开发
【UR六轴机械臂源码】python脱离示教器控制UR机械臂实时采集机器人位姿(优傲机器人)
【UR六轴机械臂源码】python脱离示教器控制UR机械臂实时采集机器人位姿(优傲机器人)
|
4月前
|
索引 Python 容器
【备战蓝桥杯】探索Python内置标准库collections的使用
【备战蓝桥杯】探索Python内置标准库collections的使用
77 1