使用 Python 检查从迷宫出来所需的罗盘使用次数的程序

使用 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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程