目录
不知道题的看这里:第十三届蓝桥杯省赛python4月23日题目汇总_悦儿姐的博客-CSDN博客
第一题:
思路:
直接拼,十分简单
代码:
S1=input()
S2=input()
print(S1+S2)
温馨小提示:题目中给你什么变量,你在代码中就尽量用什么变量。
第二题:
思路:
很容易想到列表的一个非常nice的功能,max。你如果就爱玩那麻烦的,就排个序,再打印。
代码:
N=input()
a=[int(i) for i in N] # 列表表达式
print(max(a))
这里运用了一个列表表达式,可以省去不必要的麻烦。i代表列表里的各个元素 整个式子翻译过来就是:i在N里遍历,每次的i变成数字再在a列表里变成元素
第三题:
思路:
就是小学的加减运算,小青伸手高度是a(就是举个例子,在题里人家说的是N),竹竿长度是b,给的苹果高度c,求a+b大不大于c就好
代码:
N=int(input())
M=list(eval(input())) # 万能公式
s=0
for i in M:
if N+80 >= i:
s+=1
print(s)
万能公式是指,如果你输入进来的是一个数字字符串,用英文逗号隔开,eval它,可以把它变成数字元组(逗号没了,一个个数字变成一个个元素),再list它,可以把它变成列表。
例如:输入:1,2,3,4,5 eval前:‘1,2,3,4,5’ eval后:(1,2,3,4,5) list后:[1,2,3,4,5]
第四题:
思路:
是一个递归的思路,观察可知,当N=1/2/3时,它们的方案分别为1、2、4,没有规律。但当N>=4时,N就等于所有它以前的方案数总和了,就特别像求一个数的阶乘,只不过稍稍有些变动。举个例子,当N=5,我们要求:(当N=4的方案数)+(当N=3的方案数)+(当N=2的方案数)+(当N=1的方案数),3、2、1的方案数我们知道,4的方案数还要在求一步:(当N=3的方案数)+(当N=2的方案数)+(当N=1的方案数),这样就能求出结果啦!
代码:
N = int(input()) # 输入一个数(代表物品数)
def f(N): # 创建一个递归函数
if N == 1: # 当N等于1、2、3时,结果没有规律,所以直接返回结果
return 1
elif N == 2:
return 2
elif N == 3:
return 4
else:
return f(N-1)+f(N-2)+f(N-3) # 因为我们已知的有三个没规律的 所以要把这三个都包含
print(f(N)) # 最终打印结果
第五题:
思路:
可以采用一种“污海”的思路:找到一块海,在它的下面一直找,左面一直找,找到一个“污”一个(即把1变成0),这样便能找到全部的未被污染的海域还能既不重复也不遗漏了!有人说那右边的和上边的怎么办,那要怪你没考虑周全,你如果一块海在上边或右边有海,那么在遍历它上面或右边时不早把这块海遍历“污染”了吗?所以是方法可行的。
代码:
def find_left(j,g,s,M): # 左边找找(M后期赋值 列的意思)
d=0 # 纯净海域数
while g<M-1: # 注意不要超过遍历范围,M为了变成索引号要-1
if s[j][g]==1: # 判断是否没被污染
s[j][g]=0 # 把海污染了
g+=1 # 往左一块
d+=1 # 纯净海域数+1
else:
break # 不是就退出
if d !=0: # 如果有纯净海域(不管多少,有就行)
return 1
else:
return 0
def find_down(j,g,s,N): # 下面找找,和左边方法一模一样(N后期赋值 行的意思)
d=0
while j<N:
if s[j][g]==1:
s[j][g]=0
j+=1 # 往下一块
d+=1
else:
break
if d !=0:
return 1
else:
return 0
n=input() # 输入行和列
N=int(n[0]) # 行
M=int(n[2]) # 列(去掉逗号 它算第三个)
s=[] # 总体大地图
z=0 # 纯净海域数(未被加工 拐角处会算两个)
y=0 # 拐角数(把z减掉y就剩下最终结果了)
for i in range(N): # 搞N个输入框 达到N行的效果
a=list(eval(input())) # 把输入结果转成列表
s.append(a) # 把a这个小地图放到s这个大地图里
for j in range(N): # 行索引号
for g in range(M): # 列索引号
if s[j][g]==1: # 开始判断拐角
if ((j<N-1 and s[j+1][g]==1) or (j>0 and s[j-1][g]==1)) and ((g<M-1 and s[j][g+1]==1) or (g>0 and s[j][g-1]==1)):
# 既满足 下边有 或者 上边有 还满足 右边有 或者 左边有
y+=1 # 拐角数+1
for j in range(N):
for g in range(M):
l=find_left(j,g,s,M) # 左找找
e=find_down(j+1,g,s,N) # 下找找
if e !=0 or l!=0: # 看看有没有
z+=1 # 有 纯净海域数量就+1
print(z-y) # 打印最终结果
第六题:
思路:
这题直接暴力解,一共可以分为几个大块,第一、输入,第二、对角线遍历(可以考虑用函数) 第三、判断矩形是否只有一条对角线 第四、输出
代码:
n=input() # 输入行和列
N=int(n[0]) # 行就是第一个
M=int(n[2]) # 去掉空格来算,列是第三个
s=[] # 创建一个列表,里面要装所有的格子
d=0 # 输出结果(最长奖品对角线)
for i in range(N): # 搞N行的输入框
c=input()[::2] # 去掉空格
c=[int(i) for i in c] # 转成数字
s.append(c) # 装进大列表里
def find_left(i,j,s): # 进行左对角线寻找 i是行数索引号,j是列数索引号
global N # 把N搞成全局变量,要用一下它
h=1 # 对角线奖品数
x=i # 给i和j搞个备份
y=j
a=0 # 用来判断矩形是否只有一条对角线的东东
if s[i][j] == 1: # 看看第一个是不是有奖品
while (j>0 and i<N-1)and s[i][j]==1 :
'''
循环,达到对角线遍历的效果。
N要变成索引号得-1
j要注意不要等于零(后面j-1时会超出遍历范围)。i同理。
'''
i+=1 # 往下一列
j-=1 # 往左一格
h+=1 # 对角线奖品数+1
for t in range(h): # 画(不是真的画!)出一个矩形
a=0 # 每次得把a清零一下
for r in range (h):
if y<N-1: # 小心,别又超出范围了(这种东西真的超烦)
a+=s[x][y-r] # 每次往左
'''
把在画出的矩形的每一行都统计一下,
如果这个矩形里只有一条对角线,
那么每行都只会有一个1
'''
x+=1 # 换行
if a != 1: # 判断一下
return 0 # 如果有其他的1那么就踢掉
return h # 最终返回对角线奖品数量
else: # 如果第一个就没有奖品 就没有遍历的价值了
return 0; # 直接返回0
def find_right(i,j,s): # 进行右对角线寻找 和左对角线寻找方法一模一样
global N,M # 这回M也要用用
h=1
x=i
y=j
a=0
if s[i][j] == 1:
while (i<N-1 and j < M-1) and s[i][j]==1 : # M-1的道理和N-1的一样
i+=1
j+=1 # 往右一格
h+=1
for t in range(h):
a=0
for r in range (h):
if y< M-1 :
a+=s[x][y+r] # 每次往右
x+=1
if a != 1:
return 0
return h
else:
return 0;
for i in range(N): # i是行索引号
for j in range(M): # j是列索引号
e=find_left(i,j,s) # 左边找找
f=find_right(i,j,s) # 右边也找找
d=e if e>d and e>f else f if f>d else d # 这里运用了一个三目运算符
# 返回e 得满足e>d和e>f。要不就是f 得满足f>d(因为e已经小于f了 就不比了)。都不是返回d
print(d)
文章到这里就结束啦,如果你做出来了一些题,跟我有不一样的意见,或者有好的代码,那就尽情发给我吧,评论私信都可以哈。最后发起一个小投票,有兴趣的投一下。