这种写法非常适合回溯算法,简洁地实现了 "试探 - 记录 - 回退" 的逻辑,

避免了使用额外的条件判断语句。当在当前位置找不到可行路径时,自然会触发回退操作,符合回溯法 "不撞南墙不回头" 的思想。

  1. 遍历所有可能的方向(dirs 中的 dx, dy)
  2. 计算新位置 (nx, ny) 并检查是否合法(在边界内且可通行)
  3. 如果找到合法位置,就移动过去并记录,然后break跳出循环(此时不执行 else)
  4. 如果所有方向都尝试过且没有找到合法位置(循环正常结束),就执行 else 块,回退到上一步
n, m = map(int, input().split())
desk = [list(input().strip()) for _ in range(n)]

x,y = 0,0
pos = [(0,0)] # 当前位置
# 从0,0开始,有限从下和右开始
dirs = [(1,0),(0,1),(-1,0),(0,-1)]

while True:
    if x==n-1 and y==m-1:
        print("Yes")
        break
    desk[x][y] = 'x'
    for dx, dy in dirs:
        nx, ny = dx + x, dy + y
        if 0 <= nx < n and 0 <= ny < m and desk[nx][ny] == '.':
            x, y = nx, ny
            pos.append((x,y))
            break
	# 没有执行break
    else:
        x,y = pos.pop() # 如果没有提前返回,回退到上一步
    if len(pos)==0:
        print("No")
        break