第十二届蓝桥杯青少组Python省赛真题解

单选题1:

s ='Hello Lan Qiao',执行 print(s [4:11])输出的结果为( )。  A、lo Lan Qi   B、lo Lan Q   C、 o Lan Qi   D、o Lan Q

答案:D

单选题2:循环语句 for i in range(8,-4,-2):执行了几次循环( )。  A、 4     B 、5     C、 6     D、7

答案:C  植树问题,含头不含尾,点数等于段数=(-4-8)/-2=6

单选题3:

导入 random 模块后,执行 print(random.randrange(10, 100, 2))语句,输出的结果可能是( )A、1     B、24     C、63     D、100

答案:B  random.randrange的定义域是半开,所以不可能是100。

单选题4:执行以下程序,输出的结果是( )。height = {’小蓝 ’:80,’小青’:100,’小圃 ’:70}height [’小青’] = 70 print(sum(height.values())) A、220     B 、210     C、 250     D、 7

答案:A

单选题5:

导入 turtle 模块后,执行 turtle.circle(80,steps=6)语句,所绘制的图形以下说法正确的是( )。A、绘制出一个半径为 80 像素的圆 B、 绘制出六个半径为 80 像素的圆 C、绘制出一个半径为 80 像素的圆和一个六边形 D、绘制出一个半径为 80 像素的圆内接正

答案: turtle.circle实际是绘制正多边形的函数,默认情况steps(边长数)比较大,看起来像圆。绘制起始点在圆周上,半径可正可负,当半径为正,圆心在前进方向的左侧,为负时在右侧。对于一些高分辨率的电脑,可以把steps设置得更大来改变所绘制的圆的精度。还可以有第二个参数extent是绘制圆弧的角度大小,单位默认是角度(一周角=360°),turtle.radians()切换为弧度制(一周角=2π),turtle.degrees()切换为角度制。

编程题1:  编程实现:   给定一个正整数N,计算N除以7的商。   输入描述:输入一个正整数  输出描述:输出N除以7的商(商为整数)   样例输入:  样例输出:1代码:

· 

· 

N=int(input())print(N//7)

编程题2:  编程实现:   给定一个正整数N,计算出1到N之间所有奇数的和。   输入描述:输入一个正整数  输出描述:输出1到N之间(包含1和N)所有奇数的和   样例输入:  样例输出:9代码

· 

· 

· 

· 

· 

· 

N=int(input())sv=0for i in range(1,N+1,2):    sv += i    print(sv)

编程题3:  提示信息:  “水仙花数”是指一个三位正整数,其各位数字立方的和等于该数本身。  例如:153是一个“水仙花数”,因为1³+5³+3³等于153。  编程实现:  给定一个正整数N,判断100到N之间有多少个“水仙花数”。  输入描述:输入一个正整数N(100<N<1000)  输出描述:输出100到N之间(包含100和N)有多少个“水仙花数”  样例输入:160  样例输出:1代码:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

N = int(input())sv = 0for i in range(100,N+1):    tmp = i    a = tmp % 10  #个位    tmp //= 10    b = tmp % 10   #十位    c = tmp // 10  #百位    if a**3 + b**3 + c**3 == i:        sv += 1        print(sv)

编程题4:  编程实现:   有一组连续正整数,随机乱序后生成一组数据后,小蓝不小心删掉了其中一个数,已知所删掉的这个数不是这组数据中最小的也不是最大的,现在请你编写程序帮助小蓝找到删除的那个数。   输入描述:   按照“编程实现”中的描述模仿输入一组这样的正整数(正整数之间以英文逗号隔开),在输入的时候少 一个数(这个数不是这组数据中最小的也不是最大的),这个数作为小蓝删除掉的那个数,且加上小蓝删除的那个数这组数据是连续的整数列。  输出描述:输出删除掉的是那个数   样例输入:3,2,4,6,7   样例输出:5代码:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

lst = [int(x) for x in input().split(',')]lst.sort()start = lst[0]num = Nonefor i in range(1,len(lst)):    if lst[i] > start + 1:        num = start + 1        break    else:        start = lst[i]if num:    print(num)

解说:连续整数相邻数字之差是1,如果大于1,那么中间的数丢了。

编程题5:  提示信息:  有一个密室逃脱游戏,有100间密室连在一排。密室编号是从1开始连续排列一直排到第100间密室,如下图:  游戏规则:  1. 玩家初始位置在1号密室;  2. 每次玩家可以进入右边的一个密室,也可以跳过一个密室进入下个密室(如:当玩家当前在3号密室,他可以进入4号密室也可以进入5号密室);  3. 有毒气的密室不能进入需要避开。  编程实现:  给定三个正整数X,Y,M(X<Y<M≤100),表示三个密室编号。X号密室和Y号密室有毒气泄漏,不能进入,玩家需要进入到M号密室。按照游戏规则进入M号密室有多少种路线方案。  例如:X=2,Y=4,M=7,进入M号密室有2种路线方案,分别是1->3->5->6->7路线和1->3->5->7路线。  输入描述:输入三个正整数X,Y,M(X<Y<M),X和Y表示有毒气密室编号,M表示需要进入的密室编号,且三个正整数之间以英文逗号隔开  输出描述:输出进入M号密室有多少种路线方案  样例输入:2,4,7  样例输出:2代码:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

X, Y, M = map(int, input().split(','))count = 0def compu(room):    global count    if room == M:        count += 1        return    elif room == X or room == Y or room > M:        return    else:        compu(room+1)        compu(room+2)        compu(1)print(count)

解说:
  首先忽略限制条件(没有毒气泄漏),从1号室到M号室有多少中走法,假如M=7,线路绘图如下:
由图可见没有限制条件,从1号室到7号室有13种路径,下面采用递归法计算看看结果:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

M = 7count = 0def compu(room):    global count    if room == M:        count += 1        return    elif room > M:        return    else:        compu(room+1)        compu(room+2)        compu(1)print(count)

运行结果是13。现在加入不能经2,4号室,即把经过2,4号室的路径删除,如下图:

 

可见有2种方案。加入过滤条件,程序如下:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

X, Y, M = 2, 4, 7count = 0def compu(room):    global count    if room == M:        count += 1        return    elif room == X or room == Y or room > M:        return    else:        compu(room+1)        compu(room+2)        compu(1)print(count)

结果是2。

编程题6:

  编程实现:

  有一个N*N的矩阵方格和N个棋子,现在需要将N个棋子按要求放置到矩阵方格中。  要求如下:    1.任意两个棋子不能在同一行    2.任意两个棋子不能在同一列    3.任意两个棋子不能在同一对角线上(下图红色线段都为对角线)      根据以上要求,问N个棋子放置到N*N矩阵方格中有多少种放置方案  例如:4*4的矩阵方格,4个棋子,有2种放置方案    输入描述:输入一个正整数 N(1<N<11),表示一个 N*N 的矩阵方格和 N 个棋子数量  输出描述:输出 N 个棋子按要求放置到 N*N 的矩阵方格中有多少种放置方案  样例输入:4  样例输出:2代码

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

N = int(input())
def backCheck(queen):    (row, col, fatherQueen) = queen    while fatherQueen != None:        (row1, col1, fatherQueen) = fatherQueen        if row1 == row or col1 == col or abs(col-col1) == row-row1:            return False    return True    count = 0
def eightQueens(queen, n):    global count    if n == N:        count += 1        return    for col in range(N):        nextQueen = n, col, queen        if backCheck(nextQueen):            eightQueens(nextQueen, n+1)            for col in range(N):    rootQueen = 0, col, None    eightQueens(rootQueen , 1)    print(count)

解说:
  这是非常常见的“八皇后问题”,要是没学过也不要心慌。拿起我们的法宝——减少条件,编好程序,运行正常后加入被减少的条件,如果原来的程序不适合,重构代码也不难了。  先考虑把N个对象放入N*N矩阵中,每行1个的方案数。第一行每个位置(用行列二元组)作为根节点,用一个循环调用树叶统计递归函数:

· 

· 

· 

for col in range(N):    rootQueen = (0, col)    eightQueens(rootQueen , 1)  #1但前行数,当=N返回。

   递归函数eightQueens要在每行中选一个点,然后下推到下一行,当行数达到N时,计算一个方案,然后返回。代码如下。

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

count = 0
def eightQueens(queen, n):    global count    if n == N:        count += 1        return    for col in range(N):        nextQueen = (n, col)        eightQueens(nextQueen, n+1)

   N=4时完整代码如下:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

N = 4
count = 0
def eightQueens(queen, n):    global count    if n == N:        count += 1        return    for col in range(N):        nextQueen = (n, col)        eightQueens(nextQueen, n+1)        for col in range(N):    rootQueen = (0, col)    eightQueens(rootQueen , 1)  #1但前行数,当=N返回。    print(count)        

运行结果是256,4×4×4×4=256,说明代码没问题。   现在考虑限制条件问题,同行同列这容易,主要是对角线,不过同一对角线上的点横坐标之差和纵坐标之差绝对值相等,反之亦然。   但在上面的代码中,无法知道前面的点的坐标。很自然,每个点除了保持坐标外还至少要知道它前面一个点的引用。这种朝一个方向的引用数据结构就是所谓的“单向链表”。当要生长一个点时,我们可以用递归或循环检查这个点是否符合这三个条件,代码如下:

· 

· 

· 

· 

· 

· 

· 

def backCheck(queen):    (row, col, fatherQueen) = queen    while fatherQueen != None:        (row1, col1, fatherQueen) = fatherQueen        if row1 == row or col1 == col or abs(col-col1) == row-row1:            return False    return True

   把对象拆为行、列和前一点的引用,在链表中逐点往回比较,直到根节点。

   重构代码,加入过滤条件,完成。