使用 Python 检查从迷宫出来所需的罗盘使用次数的程序
假设我们玩的是一个困在迷宫中的游戏。我们必须找到迷宫的出口。迷宫可以被表示为一个 x 行 m 列的矩阵。矩阵的每个单元/元素都包含以下符号之一:’O’、’D’、’S’ 或 ‘ -‘。’O’ 表示路径被阻塞,’D’ 表示从迷宫出口,’S’ 表示我们的起始位置,而 ‘-‘ 表示我们可以穿过路径移动。我们可以自由地穿过任何 ‘-‘ 标记的单元格。现在,我们还有一个罗盘,可以使用它来找到迷宫的出口路径(’D’ 单元)。当我们需要找方向时,我们必须使用罗盘。但是,我们最多只能使用罗盘 k 次。给定迷宫作为矩阵以及我们可以使用罗盘的次数;我们必须找出在使用了那么多次罗盘的情况下是否能够走出迷宫。如果可以,我们返回 True,否则我们返回 False。
因此,如果输入如下图所示的网格,那么:
- | O | - | O | - | - | - | - | - | - | O |
---|---|---|---|---|---|---|---|---|---|---|
- | O | D | - | O | - | O | O | O | - | O |
- | O | O | - | O | - | O | O | O | - | O |
- | O | O | - | O | - | O | S | - | - | - |
- | - | - | - | - | - | O | O | O | O | - |
n = 4,m = 11,k = 3;那么输出将为 True。
要解决该问题,我们将按照以下步骤进行:
- 定义一个函数path_search()。它将接收curr_pos、grid、total_rows、total_cols、k、predecessor
- x:curr_pos的x值
-
y:curr_pos的y值
-
如果grid[x,y]与“*”相同,则
- 如果k等于0,则
-
返回True
-
否则,
-
返回False
-
否则,
-
parent := predecessor[curr_pos]
-
succ_pos :=从succesor_positions(curr_pos,grid,total_rows,total_cols,parent)的返回值中创建一个新列表
-
use_compass := True 如果succ_pos的大小> 1
-
对于succ_pos中的每个位置,执行以下操作
- predecessor[position] := curr_pos
-
如果use_compass不为零,则
-
path_search(position,grid,total_rows,total_cols,k-1,predecessor)
-
否则,
-
path_search(position,grid,total_rows,total_cols,k,predecessor)
-
定义一个函数succesor_positions()。它将接收curr_pos、grid、total_rows、total_cols、parent
- x:curr_pos的x值
-
y:curr_pos的y值
-
succ_pos :=一个新的列表
-
如果y> 0,则
-
left := x,y-1
-
在succ_pos末尾插入left
-
如果y tot_cols – 1,则
-
right := x, y + 1
-
在succ_pos末尾插入right
-
如果x> 0,则
-
up := x-1,y
-
在succ_pos末尾插入up
-
如果x tot_rows – 1,则
-
down := x + 1,y
-
在succ_pos末尾插入down
-
如果对于succ_pos中的每个位置,grid[position[0],pos[1]]与“X”不同且pos与parent不同,则
-
返回满足条件的succ_pos中的元素
-
现在执行以下操作
-
curr_pos :=一个新的空对
-
对于网格中的每个索引i、项目行,请执行以下操作
- 对于每个索引j、行中的元素项,请执行以下操作
-
如果元素与’M’相同,则
- curr_pos :=包含i、j的新对
- predecessor :=一个新的地图,其中curr_pos := 空 initially
-
path_search(curr_pos,grid,n,m,k,predecessor)
源代码(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