python 基础知识点(蓝桥杯python科目个人复习计划24)

今日复习内容:基础算法中的模拟

1.模拟题

(1)定义:直接按照题目含义模拟即可,一般不涉及算法。

(2)注意:读懂题:理清楚题目流程;

                     代码和步骤一一对应:变量名,函数名,函数功能;

                     提取重复的部分,写成对应的函数(子模块);

                      按顺序写,分块调试。

2.例题分析

例题1:饮料换购

题目描述:

乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊c型饮料,凭3个瓶盖可以再换一瓶饮料,并且可以一直循环下去(但是不允许暂借或赊账)。

请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶饮料,最终他一共可以喝到多少瓶饮料?

输入描述:

输入一个整数n,0 <= n <= 1000,表示开始购买的饮料数量。

输出描述:

输出一个整数,表示实际得到的饮料数量。

参考答案:

方法1:

#n表示瓶盖的数量
n = int(input())
ans = n
while True:
    if n >= 3:
        #用三个瓶盖换一瓶饮料,原来的瓶数减一
        n -= 3
        #瓶子数量加一
        ans += 1
        n += 1
    else:
        break
print(ans)

运行结果:

python 基础知识点(蓝桥杯python科目个人复习计划24)_第1张图片

方法2: 

#n表示瓶盖的数量
n = int(input())
ans = n
while n >= 3:
    ans += n // 3
    n = n // 3 + n % 3
print(ans)

运行结果同上。

例题2:图像模糊

题目描述:

小蓝有一张黑白图像,由n*m个像素组成,其中从上到下共n行,每行从左到右共m列,每个像素由一个0到255之间的灰度值表示。

现在,小蓝要对图像进行模糊处理,操作的方法为:

对于每个像素,将以它为中心3*3区域内的所有像素(可能是9个像素或少于9个像素)求和后除以这个范围内的像素个数(取下整) ,得到的值就是模糊后的结果。

请注意每个像素都要用原图中的灰度值计算求和。

输入描述:

输入的第一行包含两个整数n和m;

第二行到n+1行每行包含两个m个整数,表示每个像素的灰度值,相邻整数之间用一个空格隔开,

其中,1 <= n,m <= 100。

输出描述:

输出n行,每行包括m个整数,相邻两个整数之间用一个空格隔开,表示模糊后的图像。

参考答案:

#定义二维列表
n,m = map(int,input().split())
Map = []
#需要读入n行
for i in range(n):
    a = list(map(int,input().split()))
    Map.append(a)
# 构建一个n行m列的二维列表
ans = [[0]*m for i in range(n)]
# print(ans)
for i in range(n):
    for j in range(m):
        tot, cnt = 0, 0  # 分别表示总数和个数
        for delta_x in [-1,0,1]:
            for delta_y in [-1,0,1]:
                x = i + delta_x
                y = j + delta_y
                #这九个位置都可以有,但不一定都存在,所以还要判断是否在规定范围内
                if 0 <= x < n and 0 <= y < m:
                    tot += Map[x][y]    # 这步就是求和
                    cnt += 1
        ans[i][j] = tot // cnt
for a in ans:
    print(" ".join(map(str,a)))

运行结果:

python 基础知识点(蓝桥杯python科目个人复习计划24)_第2张图片

我来说一下思路。

这个题是这样计算的,我用一个例子:

3 4
0 0 0 255
0 0 255 0
0 30 255 255

比如这个数组, 取右上角的255,则它周围仅有三个数字:0,0,255,所以根据题意,这个数字的计算结果应该是(0 + 0 + 255 + 255)// 4 = 127,原理就是这样。

接下来我来解释代码中的几个难点:

(1)

#需要读入n行
for i in range(n):
    a = list(map(int,input().split()))
    Map.append(a)

这部分的结果是:

python 基础知识点(蓝桥杯python科目个人复习计划24)_第3张图片

将输入的矩阵转换为一个列表。

(2) 

遍历3*3区域内的每个元素,用到的是我上一篇文章中写的知识点。
此时的位置是(i,j),那么它旁边的位置就是:
(i-1,j-1),(i-1,j+0),(i-1,j+1)
(i+0,j-1),(i+0,j+0),(i+0,j+1)
(i+1,j-1),(i+1,j+0),(i+1,j+1)

关于这个题的难点,我只写这么多,若还有疑问,欢迎一起讨论。

例题3:螺旋矩阵

题目描述:

对于一个n行m列的矩阵,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。例如,一个4行5列的矩阵如图所示。

1 2 3 4 5

14 15 16 17 6

13 20 19 18 7

12 11 10 9 8

输入描述:

输入格式:

第一行输入两个正整数n和m,分别表示螺旋矩阵的行数和列数;

第二行包含两个整数r和c,表示要求的行号和列号;

其中,2 < = n,m <= 1000,1 <= r <= n , 1 <= c <= m。

输出描述:

输出一个整数,表示螺旋矩阵中第r行c列的值。

参考答案:

n,m = map(int,input().split())
r,c = map(int,input().split())
Map = [[0]* m for i in range(n)]
#模拟行进过程,(x,y) = value
x,y = 0,0
value = 1
Map[x][y] = value
while value < n * m:
    # 不断向右走,且要保证下一个点在所规定的范围内,保证下一个点没有数字
    while y+1 < m and Map[x][y+1] == 0:
        value += 1
        y += 1
        Map[x][y] = value

    #往下走
    while x+1 < n and Map[x+1][y] == 0:
        value += 1
        x += 1
        Map[x][y] = value

    # 往左走
    while y-1 >= 0and Map[x][y-1] == 0:
        value += 1
        y -= 1
        Map[x][y] = value

    # 往上走
    while x-1 >= 0and Map[x-1][y] == 0:
        value += 1
        x -= 1
        Map[x][y] = value
print(Map[r-1][c-1])

运行结果:

python 基础知识点(蓝桥杯python科目个人复习计划24)_第4张图片 

这个题看着很难,但是知识点我都重复过了,若有疑问,欢迎提出,一起探讨。

OK,今天就写这么多,明天继续! 

你可能感兴趣的:(蓝桥杯,职场和发展)