算法学习第二天(python)---模拟

模拟就是将实际需求转化为数学模型来编写代码,不涉及减少时间复杂度或空间复杂的的算法(说好像又没说)

【依旧是由易到难的练习集】

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])

------未完待续

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值