蓝桥杯题库及答案python版
  这是一道结果填空的题,只需要算出一 个整数作为结果提交即可。
input_str=input()num=len(input_str)searched=[]foriinrange(num):forjinrange(num):ifstr(input_str[j:j+i:])notinsearched:searched.append(str(input_str[j:j+i:]))print(len(searched))
输出结果为:100
(2)年号字串小明用字母 A 对应数字1,B 对应2,以此类推,用 Z 对应26。对于27以上的数字,小明用两位或更长位的字符串来对应,例如AA 对应 27,AB 对应28,AZ 对应52,LQ 对 329。请问2019 对应的字符串是什么?
该题就是一个进制转换的问题,将十进制转换为26进制,因为是1~26,其中只有26个数,所以虽然是满27才进位,但应该是转26进制。
string='ABCDEFGHIJKLMNOPQRSTUVWXYZ'num=2019yu=[]whilenum>=26:yu.append(num%26)num=num//26yu.append(num)foriinyu[::-1]:print(string[i-1],end='')
输出结果为:BYQ
(3) 数列求值【问题描述】给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求第 项的最后 4 位数字。【答案提交】这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个 4 位整数(提示:答案的千位不为 0),在提交答案时只填写这个整数,填写多余的内容将无法得分。
arr=[0foriinrange()]arr[0]=arr[1]=arr[2]=1foriinrange(3,):arr[i]=(arr[i-1]+arr[i-2]+arr[i-3])%10000#这个求余可以保证每一次计算只保留后四位(4个0)#但是不会影响数列的计算,因为数列的后几位都是由后面决定的,所以前面舍去也不会影响后几位的值print(arr[])
输出为:4659
(4)数的分解把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法? 注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。
思路:该题用两个for循环进行求解,首先为了保证不重复,那我们只要保证三个数i,j,k始
终是又小到大递增即可,即我们设置两个数的取值范围为:
第一个数是i取值范围为:[1,675],第二个数为j取值范围为:[i+1,1344]
(此处的上限是因为i是三个数中最小,所以小于总和的三分之一,j是第二小所以应该小于总和的三分之二)通过减少上限缩短循环时长
然后判断第三个数是否比j大,如果是则计数变量+1,保证了三个数的大小顺序始终固定,就不会出现“ 1000+1001+18 和 1001+1000+18 ”这样的重复计数情况发生了。
当然,在这之前我们首先要判断i,j,k中是否包含‘2’和‘4’。这个使用一个函数即可解决。
n=2019count=0defcheck(n):n_str=list(str(n))if'2'notinn_str:if'4'notinn_str:returnTruereturnFalseforiinrange(1,676):forjinrange(i+1,1345):ifcheck(i)andcheck(j):k=n-i-jifk>jandcheck(k):count+=1print(count)
输出为:40785
题目:
思路:
其实就是一个BFS(广度搜索算法)
首先是对于迷宫 的输入部分:
(1)创建一个n+2列,m+2行全为1的二维数组
  (2)按行输入迷宫,之后将每一个字符转换为整数类型后填入每一列,然后再接受下一行的输入。
最终创建的二维数组是一个由“1”包围在外侧的迷宫e二维数组
然后是BFS主函数部分:
(1)创建一个空的队列,以及一个记录遍历走过的节点的队列(path),并将起点添加至队列当中,第三个参数用于记录其父节点,第四个参数用于记录移动的方向(上,下,左,右),"-1"表示无父节点,且无移动方向。
(2)设置一个循环,若队列不为空则一直进行操作
(3)弹出队列中第一个节点,设置为当前节点,并将该节点添加至path数组
  (4)判断当前节点是否到达终点,若到达终点则输出路径。(路径函数见后文)
(5)对提前设置好的lambda函数进行遍历,分别对当前节点的上下左右节点进行判断,是否能遍历,若能,则将当前节点的下一节点添加至队列当中,并且做一个标记,表示已经遍历过了。
值得注意的是,添加队列的时候多设置了两个参数,第三个参数是记录当前节点(也就是下一节点的父节点在path中的位置,即下标),第四个参数count记录遍历的方向(上下左右)
(6)弹出队列里的当前第一个节点,继续循环
输出函数部分:
(1)因为path包含的所有路径的节点,但是我们只需要可以到达终点的路径,所有创建创建一个空列表记录到达终点的那条路径。
(2)设置当前节点为path列表的最后的一个节点,若当前节点的第三个元素不为”-1“即父节点不为空(即不是起点)就一直进行循环。
(3)将当前节点加入需打印路径列表中(即prin_path列表)
(4)设置当前节点的父节点作为下一个当前节点(此处的第三个元素就是其父节点在path列表中的下表)
(5)将需打印路径列表反装(即终点在后,起点在前)
(6)在跟进其第四项参数count,判断其的遍历方向,加入action列表,并打印,即为所求。
代码:
m,n=map(int,input().split())map_int=[[1]*(n+2)]foriinrange(1,m+1):map_int.append([1]*(n+2))nums=input()nums="1"+nums# 先建立一个二维数组,再将输入以int类型放入forjinrange(1,n+1):map_int[i][j]=ord(nums[j])-48#先建立一个二维数组,再将输入以int类型放入map_int[i][-1]=1map_int.append([1]*(n+2))dirs=[lambdax,y:(x+1,y),lambdax,y:(x-二叉树的遍历python1,y),lambdax,y:(x,y+1),lambdax,y:(x,y-1),]defprin_path(path):prin_path=[]action=[]curNode=path[-1]whilecurNode[2]!=-1:prin_path.append(curNode)curNode=path[curNode[2]]prin_path.reverse()fornodeinprin_path:ifnode[3]==1:action.append('D')elifnode[3]==2:action.append('U')elifnode[3]==3:action.append('R')elifnode[3]==4:action.append('L')print(len(prin_path))print("".join(action))defbreath_search(x1,y1,x2,y2):queue=
[]path=[]queue.append((x1,y1,-1,-1))whilelen(queue)>0:curNode=queue.pop(0)path.append(curNode)ifcurNode[0]==x2andcurNode[1]==y2:prin_path(path)returnTruecount=0fordirindirs:nextNode=dir(curNode[0],curNode[1])count+=1ifmap_int[nextNode[0]][nextNode[1]]==0:queue.append((nextNode[0],nextNode[1],len(path)-1,count))map_int[nextNode[0]][nextNode[1]]=2else:print('无路')returnFalsebreath_search(1,1,m,n)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。