题解 | #迷宫问题#
迷宫问题
https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc
inline1 = input().split(' ')
rows, cols = int(inline1[0]), int(inline1[1])
maze = []
for _ in range(rows):
inline2 = list(map(int, input().split(' ')))
maze.append(inline2)
from typing import Any
# rows, cols = 5, 5
# maze = [[0, 1, 0, 0, 0],
# [0, 1, 1, 1, 0],
# [0, 0, 0, 0, 0],
# [0, 1, 1, 1, 0],
# [0, 0, 0, 1, 0],]
class Solution:
def __init__(self, maze_in, rows_in, cols_in) -> None:
self.maze = maze_in
self.rows = rows_in
self.cols = cols_in
self.path = []
def explore(self, start):
if start == [self.rows-1, self.cols-1]:
return True
# 以下每一种搜索路径不冲突,不能用elif
# 如果有抵达路径,则一定会在以下判断中返回True,反之会走完以下所有判断返回False
if 0 < start[0] and not self.maze[start[0]-1][start[1]]:
self.maze[start[0]-1][start[1]] = 2
if self.explore([start[0]-1, start[1]]):
self.path.append([start[0]-1, start[1]])
return True
if start[0] < self.rows-1 and not self.maze[start[0]+1][start[1]]:
self.maze[start[0]+1][start[1]] = 2
if self.explore([start[0]+1, start[1]]):
self.path.append([start[0]+1, start[1]])
return True
if 0 < start[1] and not self.maze[start[0]][start[1]-1]:
self.maze[start[0]][start[1]-1] = 2
if self.explore([start[0], start[1]-1]):
self.path.append([start[0], start[1]-1])
return True
if start[1] < self.cols-1 and not self.maze[start[0]][start[1]+1]:
self.maze[start[0]][start[1]+1] = 2
if self.explore([start[0], start[1]+1]):
self.path.append([start[0], start[1]+1])
return True
return False
def __call__(self, start) -> Any:
if self.maze[start[0]][start[1]] == 1: # 判断0,0是否有可行路径
return False
else:
self.maze[start[0]][start[1]] = 2
if self.explore(start):
self.path.append(start)
for ptr in self.path[::-1]:
print('({},{})'.format(*ptr))
else:
return False
sol = Solution(maze, rows, cols)
sol([0, 0])
关键在于递归终止条件的写法,任一个路径如果递归抵达返回True,所有路径都不能递归抵达则返回False


科大讯飞公司氛围 432人发布