代码如下。核心思想是广度优先算法,每一年的草都会长出新的草。不断遍历。
n,m=map(int,input().split())
lawn=[['.']*m for i in range(n)]
queue=[]#队列
for i in range(n):
line=input()
for j in range(m):
lawn[i][j]=line[j]
if line[j]=='g':
queue.append((i,j))
k=int(input())
period=[0]*(k+1)#记录每一年新长草的数量。
for i in range(n):
for j in range(m):
if lawn[i][j]=='g':
period[0]+=1
for i in range(1,k+1):#第几年后
for j in range(period[i-1]):#遍历前一年所有新长出的草
row,col=queue[0]
for pos in [(-1,0),(1,0),(0,-1),(0,1)]:
drow,dcol=pos
new_row=row+drow
new_col=col+dcol
if 0<=new_row<=n-1 and 0<=new_col<=m-1 and lawn[new_row][new_col]=='.':
#剪枝,否则会重复计算。
queue.append((new_row,new_col))
lawn[new_row][new_col]='g'
period[i]+=1
queue.pop(0)
for i in range(n):
print(''.join(lawn[i]))