模拟就是将实际需求转化为数学模型来编写代码,不涉及减少时间复杂度或空间复杂的的算法(说好像又没说)
【依旧是由易到难的练习集】
1.饮料换购。若每3个饮料瓶盖可以换一瓶饮料,那么输入初始购入的饮料数n,最后 一共能喝到多少瓶。
【对于初始购入的饮料数n,每喝三瓶兑换一瓶,n-3+1,然后继续喝,直到n<3。设最后一共喝到m瓶,在没有兑换的初始m=n,每兑换一次m=m+1】
n=int(input())
m=n
while n>=3:
n=n-3+1
m=m+1
print(m)
【当然,我们可以加速这个过程,把全部饮料三个为一捆同时喝完兑换新的,然后再重复上一过程直到n>3。一捆为一瓶加上剩下的,也就是对n除3取整再加余数】
n=int(input())
m=n
while n>=3:
m=m+n//3
n=n//3+n%3
print(m)
【记得一定要先计算m再改变n的实际值】
2.图像模糊。输入n行m列整数(1≤n,m≤100),每一个整数代表一个像素,对于每一个像素以它为中心3*3区域内的所有像素的平均值,就是这个像素模糊后的结果(涉及超出图像范围外的不算,如图像的四角只用算4个像素的平均值)。
【创建一个二维数组用来存放输入的“图像”,要想计算均值就要遍历以它为中心3*3范围内的像素
我们可以根据这些像素的位置特点来考虑遍历的方法,设中心点为x(行),y(列),则
(x-1,y-1) (x-1,y+0) (x-1,y+1)
(x+0,y-1) (x+0,y+0) (x+0,y+1)
(x+1,y-1) (x+1,y+0) (x+1,y+1)
这样就有思路了,先用两重循环来遍历每一个作为中心点的(x,y),然后根据位置特点,再用两重循环遍历以(x,y)为中心,分别+1、+0、+(-1)位置的像素值
求均值后,将其值作为模糊后的像素存入新的二维数组中
注意判断,不是每一个中心点周围都恰好有8个像素】
#输入n和m作为像素的行和列
n,m=map(int,input().split())
#将输入存入二维数组中
Map=[]
for i in range(n):
a=list(map(int,input().split()))
Map.append(a)
#创建一个值全为0的,同样大小的数组存放模糊后的数值
Ans=[[0]*m for i in range(n)]
#开始遍历每一个中心点(x,y)
for x in range(n):
for y in range(m):
tot,cnt=0,0#分别用于计算总和和个数
for i in range(-1,2):
for j in range(-1,2):
xi=x+i
yj=y+j
if 0<=xi<n and 0<=yj<m:
tot=tot+Map[xi][yj]
cnt=cnt+1
Ans[x][y]=tot//cnt
for a in Ans:
print(" ".join(map(str,a)))
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列的元素值
【还是运用上面那个题的位置规律,左移右移就是列数的递增或递减(上下同理),同时更改范围
保证没有越界】
n,m=map(int,input().split())
r,c=map(int,input().split())
Map=[[0]*m for i in range(n)]
#记录当前位置x,y
x,y=0,0
#记录值
value=1
Map[x][y]=value
while value<n*m:
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])
------未完待续