蓝桥杯-长草

没有白走的路,每一步都算数🎈🎈🎈

题目描述:

已知一个长度为n,宽度为m的长方形草地,但不是每一个方格里面都长满了草,只有部分的方格张了些草。并且每个月草会向上下左右都繁殖一个草,并且满足在边界范围内。即若衍生的草不在边界范围内的,就不会生长。试求第k个月之后,这块方形地的生长情况是怎么样的?

输入描述:

第一行:

输入两个数据,n,m分别表示长方形地区的长度和宽度

第二行及其n行:

每行m个数据,表示第n行的长草情况,其中该块地若长草,我们用g表示,否则用.表示。

最后一行,输入k表示,这块地生长了多少个月

输出描述:

输出k个月之后,这块土地的草地情况

样例输入输出:

样例输入: 

4 5

.g...

.....

..g..

.....

样例输出:

gggg.

gggg.

ggggg

.ggg.

算法分析:

显然这是一道BFS的题目。此次用时4个多小时,写出了超时的代码,部分样例没有通过。

数据结构定义:

  • mp数组:表示杂草地,g表示杂草,.表示空地
  • d数组:表示递归桥梁的数组
  • a数组:存放第一次BFS位置,即输入数据中g的位置

代码设计:

  • 最开始的分割字符,map(str,input())非常适合用于分割很多连在一起的数据 ps:这里卡住一段时间
  • bfs函数,这里卡住最长时间,当初bfs()函数传参的时候,没有把k写入进去,出现bug。导致,对样例的k=2时,出现有部分杂草没有繁殖。遂改成三个参数的情况。
  • 逻辑有点小错误

         这里不应该写成if mp[ni][nj]=='.':,直接删除即可,因为这样会误导至有些杂草也不会繁殖。

  • 最后就是解决超时问题。
#长草
import os
import sys
n,m = map(int,input().split())
mp = [list(map(str,input()))for i in range(n)]
k = int(input())
d = [[0,1],[0,-1],[1,0],[-1,0]]
a = []

def bfs(i,j,k):
    if k<=0:
        return 
    for x in range(4):
        ni,nj = i+d[x][0],j+d[x][1]
        if 0<=ni<=n-1 and 0<=nj<=m-1:
            mp[ni][nj] = 'g'
            bfs(ni,nj,k-1)

for i in range(n):
    for j in range(m):
        if mp[i][j] =='g':
            a.append([i,j])
for x in a:
    bfs(x[0],x[1],k)

for i in range(n):
    for j in range(m):
        print(mp[i][j],end = '')
    print()

改进版BFS:

数据结构:

  • 导入deque包,BFS几乎都会用到这个,以及常用popleft方法
from collections import deque
n,m = map(int,input().split())
mp = [list(map(str,input()))for i in range(n)]
##print(mp)
k = int(input())
q = deque()
for i in range(n):
    for j in range(m):
        if mp[i][j] == 'g':
            q.append((i,j,k))

##print(q)
while True:
    x,y,z = q.popleft()
    if z==0:
        for i in range(n):
            print(''.join(mp[i]))
        break
    for i,j in [[1,0],[-1,0],[0,1],[0,-1]]:
        nx,ny = x+i,y+j
        if 0<=nx<n and 0<=ny<m and mp[nx][ny]=='.':
            mp[nx][ny]='g'
            q.append((nx,ny,z-1))

每日一句

摘自《《晚熟的人》》:

本性善良的人都晚熟,并且是被劣人催熟的。后来虽然开窍了,但也仍然善良与赤诚,不断地寻找同类,最后却成了最孤独的一个。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Li&&Tao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值