题解 | #迷宫问题#
迷宫问题
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