题目描述
解题思路
最短时间走迷宫!肯定用dfs。但是这个题加了一些很多新的条件。
1.这个小明先开始是有体型的,而且体型会随着时间的变化而变化!所以你得设置一个函数判断当前步小明的体型是多大!当然判断下一步能不能走时不仅是看上下左右是不是*号更是要算上体型的覆盖范围有不有障碍这里也要设置一个函数判断记为check
2.判断下一步能不能走也就是能不能进队列,既要是否越界+check判断
3.小明是可以呆着不动的,在当前坐标的基础上时间加1。但是如果小明已经是正常人体型一定是要动的不然不满足最短时间!
具体看代码注释
代码
n,k=map(int,input().strip().split())
maps=[list(input()) for _ in range(n)]
q=deque([(2,2,2,0)])#比直接构造que快一点
walked=[[0 for i in range(n)] for _ in range(n)]#查看已是否走过的路径,如果走过则置为1
walked[2][2]=1#起点为第三行第三列因为小明先开始太胖了!
direct=[(-1,0),(1,0),(0,-1),(0,1)]#只能向上下左右移动
def f(t):
'''检查时间返回状态,用此来判断此时小明该占多少格'''
if t<k:
return 2
if t<2*k:
return 1
else:
return 0#当超过2k时,小明已经变成正常人所以不用在dir加上体型,就直接用dir
def check(x,y,z):
'''检查该点能不能走,体型+要移动的格子如果范围内有障碍则不能走'''
for i in range(x-z,x+z+1):
for j in range(y-z,y+z+1):
if maps[i][j]=='*':
return False
return True
def bfs():
'''用bfs算法找最短时间'''
while q:
x,y,state,time=q.popleft()
if x==n-3 and y==n-3:#题目设置重点在n-2,但是由于从0开始所以n-3。如果到终点直接返回当前花了多少时间
return time
if state!=0:
#当小明还没有变成正常人时,小明可以选择不动
q.append((x,y,f(time+1),time+1))
for dx,dy in direct:
nx=x+dx
ny=y+dy
#接下来判断出界没有,第一判断是否越界,第二判断该点是否被走过
if 0<=nx-state and nx+state<n and 0<=ny-state and ny+state<n and walked[nx][ny]==0:
#再次判断,如果自己要走的格子加体型范围内有障碍,则不能走
if check(nx,ny,state)==True:
q.append((nx,ny,f(time+1),time+1))
walked[nx][ny]=1#如果走过
print(bfs())