题目描述精选项目课程_IT热门课程_蓝桥云课课程 - 蓝桥云课
(可以在蓝桥云客里面找到这个题,也可以去蓝桥杯官网里的练习系统)
某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有 3 种:左转(记为 L),右转(记为 R),向前走若干厘米(直接记数字)。
例如,我们可以对小车输入如下的指令:
15L10R5LRR10R20
则,小车先直行 15 厘米,左转,再走 10 厘米,再右转,
不难看出,对于此指令串,小车又回到了出发地。
你的任务是:编写程序,由用户输入指令,程序输出每条指令执行后小车位置与指令执行前小车位置的直线距离。
输入描述
用户先输入一个整数 n(n<100)n (n<100),表示接下来将有 n 条指令。
接下来输入 n 条指令。每条指令只由 L、R 和数字组成(数字是 0 ~ 100 之间的整数)
每条指令的长度不超过 256 个字符。
输出描述
程序则输出 nn 行结果,每条结果表示小车执行相应的指令前后位置的直线距离。要求四舍五入到小数后 2 位。
输入输出样例
问题分析:首先作为一道决赛题 是需要静下心来好好分析。
题目的意思是,给出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)#输出两点间距离