Python:模拟(包含例题:饮料换购 图像模糊 螺旋矩阵)
模拟题:直接按照题目含义模拟即可,一般不涉及算法
注意:
1.读懂题:理清楚题目流程
2.代码和步骤一一对应:变量名,函数名,函数功能
3.提取重复的部分,写成对应的函数(子模块)
4.按顺序写,分块调试
例题一:饮料换购
题目描述
乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊 C 型饮料,凭 3 个瓶盖可以再换一瓶 C 型饮料,并且可以一直循环下去(但不允许暂借或赊账)。
请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的 n 瓶饮料,最后他一共能喝到多少瓶饮料。
输入描述
输入一个整数 n(0<n<1000)n(0<n<1000),表示开始购买的饮料数量。
输出描述
输出一个整数,表示实际得到的饮料数
输入输出样例
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
代码
#n表示瓶盖的数量
n=int(input())
#刚开始答案等于n
ans=n
while True:
if n>=3:
#把三个瓶盖换成一个饮料
n=n-3
#统计饮料的总和
ans +=1
#更新瓶盖数量
n+=1
else:
break
print(ans)
例题二:图像模糊
题目描述
小蓝有一张黑白图像,由 n×mn×m 个像素组成,其中从上到下共 nn 行,每行从左到右 mm 列。每个像素由一个 00 到 255255 之间的灰度值表示。
现在,小蓝准备对图像进行模糊操作,操作的方法为:
对于每个像素,将以它为中心 3×33×3 区域内的所有像素(可能是 99 个像素或少于 99 个像素)求和后除以这个范围内的像素个数(取下整),得到的值就是模糊后的结果。
请注意每个像素都要用原图中的灰度值计算求和。
输入描述
输入的第一行包含两个整数 n,mn,m。
第 22 行到第 n+1n+1 行每行包含 mm 个整数,表示每个像素的灰度值,相邻整数之间用一个空格分隔。
其中,1≤n,m≤1001≤n,m≤100 。
输出描述
输出 nn 行,每行 mm 个整数,相邻整数之间用空格分隔,表示模糊后的图像。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
代码
n,m=map(int,input().split())
Map=[]
for i in range(n):
a=list(map(int,input().split()))
Map.append(a) #将生成的列表添加到Map列表中
#构建一个N行M列二维List
ans=[[0]*m for i in range(n)]
#遍历列表的每个位置
for i in range(n):
for j in range(m):
#(i-1,j-1) (i-1,j) (i-1,j+1)
#(i,j-1) (i,j) (i,j+1)
#(i+1,j-1) (i+1,j) (i+1,j+1)
#遍历周围的3*3区域
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
#判断坐标(x,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)))
例题三:螺旋矩阵
问题描述
对于一个 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≤m2≤n,m≤1000,1≤r≤n,1≤c≤m。
输出描述
输出一个整数,表示螺旋矩阵中第 r行第 c 列的元素的值。
输入输出样例
示例
输入
4 5
2 2
输出
15
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
代码
n,m=map(int,input().split())
r,c=map(int,input().split())
Map=[[0]*m for i in range(n)]
#模拟进行过程(x,y)=valu
x,y=0,0
value=1
Map[x][y] = value
#(x,y-1) (x,y) (x,y+1)
# (x+1,y)
while value<n*m:
#不断向右走:1.保证下一个点不越界 2.保证下一个点没有数字
while y+1 <m and Map[x][y+1]==0:
y +=1
value +=1
Map[x][y]=value
#向下走:保证下一个点不越界,保证下一个点没有数字
while x+1 <n and Map[x+1][y]==0:
x+=1
value +=1
Map[x][y]=value
#向左走
while y-1 >=0 and Map[x][y-1]==0:
y -=1
value +=1
Map[x][y]=value
#向上走
while x-1 >=0 and Map[x-1][y]==0:
x -=1
value +=1
Map[x][y]=value
print(Map[r-1][c-1])