在 Python 中检查指南针使用次数是否足以走出迷宫的程序
假设我们正在玩一个游戏,我们被困在迷宫中。我们必须找到走出迷宫的路。迷宫可以表示为xm矩阵,其中n是行数,m是列数。矩阵的每个单元格/元素包含任何符号“O”、“D”、“S”或“-”。'O'表示路径被阻塞,'D'是迷宫的出路,'S'是我们的起始位置,'-'表示我们可以通过路径。我们可以在任何带有“-”标记的单元格中自由移动。现在,我们还有一个指南针,我们可以使用它找到迷宫的出口路径(“D”单元格)。当我们必须找到方向时,我们必须使用指南针。但是,我们最多可以使用指南针k次。将迷宫作为矩阵以及我们可以使用指南针的次数;我们必须弄清楚我们是否可以在使用指南针多次的情况下走出迷宫。如果可能,我们返回True,否则我们返回False。
所以,如果输入像grid=
n=4,m=11,k=3;那么输出将为True。
源代码(Python)
让我们看看以下实现以获得更好的理解-
def path_search(curr_pos, grid, total_rows, total_cols, k, predecessor): x, y = curr_pos if grid[x][y] == "D": if k == 0: print('True') else: print('False') else: parent = predecessor[curr_pos] succ_pos = list(succesor_positions(curr_pos, grid, total_rows, total_cols, parent)) use_compass = len(succ_pos) > 1 for position in succ_pos: predecessor[position] = curr_pos if use_compass: path_search(position, grid, total_rows, total_cols, k - 1, predecessor) else: path_search(position, grid, total_rows, total_cols, k, predecessor) def succesor_positions(curr_pos, grid, total_rows, total_cols, pred): x, y = curr_pos succ_pos = [] if y > 0: left = (x, y - 1) succ_pos.append(left) if y < total_cols - 1: right = (x, y + 1) succ_pos.append(right) if x > 0: up = (x - 1, y) succ_pos.append(up) if x < total_rows - 1: down = (x + 1, y) succ_pos.append(down) return filter(lambda pos: grid[pos[0]][pos[1]] != "O" and pos != pred, succ_pos) def solve(grid, n, m, k): curr_pos = () for i, row in enumerate(grid): for j, element in enumerate(row): if element == 'S': curr_pos = (i, j) path_search(curr_pos, grid, n, m, k, predecessor = {curr_pos: None}) grid = [['-', 'O', '-', 'O', '-', '-', '-', '-', '-', '-', 'O'], ['-', 'O', 'D', '-', 'O', '-', 'O', 'O', 'O', '-', 'O'], ['-', 'O', 'O', '-', 'O', '-', 'O', 'S', '-', '-', '-'], ['-', '-', '-', '-', '-', '-', 'O', 'O', 'O', 'O', '-']] solve(grid, 4, 11, 3)
输入
grid = [['-', 'O', '-', 'O', '-', '-', '-', '-', '-', '-', 'O'], ['-', 'O', 'D', '-', 'O', '-', 'O', 'O', 'O', '-', 'O'], ['-', 'O', 'O', '-', 'O', '-', 'O', 'S', '-', '-', '-'], ['-', '-', '-', '-', '-', '-', 'O', 'O', 'O', 'O', '-']] , 4, 11, 3
输出结果
True