如何在网格中找到所有可能的唯一路径?

2023-11-29

我有一个 3 x 3 网格,其中有随机放置的障碍物,其中有一个随机起点但没有终点。当没有更多的单元格可供占用时,将创建端点。移动可以向上、向下、向左或向右。

如何查看网格内所有可能的唯一路径?

Example:

  • 一旦在寻找路径时使用了某个单元,就不能再次使用它(1 变成 0)。
  • 如果没有更多的相邻小区可移动,则路径结束。无论天气如何,所有牢房都已被探访过。
# bottom left is (0, 0) and top right is (2, 2)...
# start is (1, 1) and obstacle is (2, 1)
    
[1] [1] [1]
[1] [S] [0]
[1] [1] [1]
    
S = starting point
0 = obstacle
1 = open cell

对于上面的示例,将有 6 条唯一路径。

path_1 = (1, 2), (2, 2) # up, right
path_2 = (1, 0), (2, 0) # down, right
path_3 = (0, 1), (0, 2), (1, 2), (2, 2) # left, up, right, right
path_4 = (0, 1), (0, 0), (1, 0), (2, 0) # left, down, right, right
path_5 = (1, 2), (0, 2), (0, 1), (0, 0), (1, 0), (2, 0) # up, left, down, down, right, right
path_6 = (1, 0), (0, 0), (0, 1), (0, 2) (1, 2), (2, 2) # down, left, up, up, right, right

要获取所有路径,可以使用 DFS 或 BFS,但每个路径需要有唯一的visited设置为跟踪您:

  1. 不要在一条路径中两次返回同一坐标
  2. 允许不同的路径走在同一坐标上

我为网格编写了 DFS 实现here解决方案将依赖于这个例子。

Solution

要进行图搜索,需要定义状态,在本例中是坐标,但对于这个问题,为了方便起见,我们将跟踪两个参数:

  1. 所采取的路径将通过破解代码(right = 0,down = 1,left = 2,up = 3)记录,这是一种形式链码
  2. the visited由于上述原因,为每个路径设置的内容将被取消记录

Python中的实现如下(在我的例子中,左上角匹配坐标(0,0),右下角匹配坐标(n-1,n-1)nXn grid)

import collections
def find_paths(grid, start_coord):
    paths       = set()  # paths will be added here
    state_queue = collections.deque([]) # Pending states which have not been explored yet
    # State is a tuple consists of:
    # 1. current coordinate
    # 2. crack code path
    # 3. set of visited coordinates in that path
    state       = [start_coord, [], {start_coord}]  # Starting state
    while True:
        # Getting all possible neighboring states
        # Crack code (right=0, down=1, left=2, up=3)
        state_right = [(state[0][0],state[0][1]+1), state[1] + [0], state[2].copy()] if state[0][1]+1 < len(grid[state[0][0]]) else None
        state_down  = [(state[0][0]+1,state[0][1]), state[1] + [1], state[2].copy()] if state[0][0]+1 < len(grid) else None
        state_left  = [(state[0][0],state[0][1]-1), state[1] + [2], state[2].copy()] if state[0][1]-1 >= 0 else None
        state_up    = [(state[0][0]-1,state[0][1]), state[1] + [3], state[2].copy()] if state[0][0]-1 >= 0 else None
        # Adding to the queue all the unvisited states, as well as to the visited to avoid returning to states
        blocked_counter = 0
        for next_state in [state_right, state_down, state_left, state_up]:
            if next_state is None:
                blocked_counter += 1
            elif next_state[0] in state[2] or grid[next_state[0][0]][next_state[0][1]] == 0:
                blocked_counter += 1
            else:
                next_state[2].add(next_state[0])
                state_queue.append(next_state)
                
        # After checking all directions' if reached a 'dead end', adding this path to the path set
        if blocked_counter == 4:
            paths.add(tuple(state[1]))
        # Popping next state from the queue and updating the path if needed
        try:
            state = state_queue.pop()
        except IndexError:
            break
    return paths

解释

  1. 首先,我们创建初始状态,以及初始路径(空列表)和visited设置,仅包含起始坐标

  2. 对于我们所处的每个状态,我们都会执行以下操作: 2.1.创建四个相邻状态(向右、向上、向左或向下前进)

    2.2.通过检查我们所在的路径是否已经访问过该坐标以及该坐标是否有效来检查我们是否可以在每个方向上前进

    2.3.如果我们可以朝上述方向前进,请添加此next_state to the state_queue以及visited路径的集合

    2.4.如果我们不能在四个方向中的任何一个方向前进,我们就到达了“死胡同”,我们将我们所在的路径添加到paths set

    2.5.弹出下一个状态state_queue这是一个不好的名字,因为它是一个堆栈(由于从堆栈的同一侧追加和弹出)deque()

  3. 当。。。的时候state_queue为空,我们完成了搜索,我们可以返回所有找到的路径

当使用给定的示例运行时,即

start_coord = (1,1)
grid = [[1, 1, 1],
        [1, 1, 0],
        [1, 1, 1]]

We get:

find_paths(grid, start_coord)
# {(2, 3, 0, 0), (3, 2, 1, 1, 0, 0), (3, 0), (2, 1, 0, 0), (1, 0), (1, 2, 3, 3, 0, 0)}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在网格中找到所有可能的唯一路径? 的相关文章

  • 两组数的最小公等和及组合

    我目前正在用 C 创建一个程序 该程序将查找两组数字的尽可能低的相等总和 您可以在其中根据需要多次重复这些数字 比如我有这两套 10 13 18 and 12 16 22 我能得到的最低金额是28 10 18 and 12 16 另一个例子
  • 无需构建树即可预测霍夫曼压缩比

    我有一个二进制文件 我知道其中每个符号出现的次数 如果我要使用霍夫曼算法压缩它 我需要预测压缩文件的长度 我只对假设的输出长度感兴趣 而不对单个符号的代码感兴趣 因此构建霍夫曼树似乎是多余的 作为一个例子 我需要得到类似的东西 包含 4 个
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • C 埃及分数

    古埃及人仅使用以下形式的分数1 n因此任何其他分数都必须表示为这些单位分数的总和 而且 所有单位分数都是不同的 在C或Java中使任何分数成为埃及分数 总和越少越好 的好方法是什么 可以使用什么算法 分支定界 a 例如 3 4 1 2 1
  • 两个整数乘积的模

    我必须找到c c a b mod m a b c m 是 32 位整数 但 a b 可以超过 32 位 我正在尝试找出一种计算 c 的方法 而不使用 long 或任何 gt 32 位的数据类型 有任何想法吗 如果m是质数 事情可以简化吗 注
  • 直接选择排序与交换选择排序

    有什么区别直接选择排序 vs 交换选择排序 今天我陷入了一场争论 我的教授在他的讲义中使用了这两个术语 维基百科和任何教科书或网站都会为您提供的选择排序就是他所说的 交换选择排序 我以前从未听说过 交换选择排序 这个术语 仅 选择排序 并且
  • 迭代任意大小的子集

    我可以迭代大小为 1 的子集 for int a 0 a lt size a 或大小为 2 的子集 for int a1 0 a1 lt size a1 for int a2 a1 1 a2 lt size a2 or 3 for int
  • 从一种数字系统转换为另一种数字系统后会有多少位数字

    主要问题 有多少位数字 让我解释 我有一个二进制数 11000000 十进制数是192 转换为十进制后 它有多少位 以十进制表示 在我的示例中 它是 3 位数字 但是 这不是问题 我在互联网上搜索并找到了一种用于整数部分的算法和一种用于小数
  • 在 O(n) 时间内排序?

    我被这个问题困扰了 2周 知道如何处理它吗 令 L 为 n 个不同整数的列表 假设 L 的 x 的元素在 1 750 范围内 设计线性排序算法对 L 的元素进行排序 我已经尝试过插入排序 但我不确定我的方法是否正确 Construct an
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 举例解释bpe(字节对编码)?

    有人可以帮忙解释一下背后的基本概念吗BPE模型 除了这张纸 https arxiv org abs 1508 07909 目前还没有那么多解释 到目前为止我所知道的是 它通过将罕见和未知的单词编码为子词单元序列来实现开放词汇表上的 NMT
  • 以 O(1) 计算汉明权重 [重复]

    这个问题在这里已经有答案了 在二进制表示中 汉明权重是 1 的数量 我偶然发现了网络并找到了一个 O 1 的答案 v v v gt gt 1 0x55555555 v v 0x33333333 v gt gt 2 0x33333333 in
  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 使用 CSS 网格布局使网格项内的元素高度相等

    我在长度超过 4 的 div 中有一系列文章 没有任何舍入行标签 我需要将其表示为每行 3 篇文章 列 的表格 可能包含display grid 每篇文章都有页眉 章节和页脚 如何在每行文章内实现每个标题的等高 每个部分的等高以及与文章底部
  • 需要解释搜索最小大和的算法

    我正在解决 Codility 问题作为练习 但无法回答其中一个问题 我在互联网上找到了答案 但我不明白这个算法是如何工作的 有人可以引导我逐步完成它吗 这是问题 You are given integers K M and a non em
  • 数学/算法使图像适合屏幕保留纵横比

    我需要数学 算法方面的帮助来拍摄已知尺寸的图像并适合两个屏幕尺寸之一 720 x 480 或 1280 x 1024 图像尺寸来自 XML 文件 但这些尺寸是 Web 尺寸 我还从 XML 中选择了一些图像 这些图像的分辨率可能比 Web
  • 平铺单纯形噪声?

    我 作为业余爱好者 对伪随机噪声生成很感兴趣 特别是 Perlin 和 Simplex 算法 Simplex 的优点是速度 尤其是在更高的维度上 但 Perlin 可以相对容易地平铺 我想知道是否有人知道平铺单纯形算法 固定维度就好 泛型更
  • O(1) 算法确定节点是否是多路树中另一个节点的后代?

    想象一下下面的树 A B C D E F 我正在寻找一种方法来查询 F 是否是 A 的后代 注意 F 不需要是directA 的后代 在这种特殊情况下这是正确的 只需要针对更大的潜在后代节点池测试有限数量的潜在父节点 当测试一个节点是否是潜
  • 动态规划 (DP) 中的重叠子问题是什么?

    为了使动态规划适用 问题必须具有两个关键属性 最优子结构 and 重叠子问题 1 https en wikipedia org wiki Dynamic programming 对于这个问题 我们只关注后一个属性 有各种不同的定义重叠子问题

随机推荐

  • htmlentities() 使汉字无法使用

    我们有一个 Web 应用程序 允许用户在文本区域中输入自己的 html 我们将该数据保存到我们的数据库中 当我们将html数据加载到文本区域时 当然 我们在将html数据扔到文本区域之前使用htmlentities 否则 用户可以在文本区域
  • 代码运行速度太慢

    我正在尝试运行一段代码 将值从一个电子表格复制到另一个电子表格 但是顺序不同 很难使其成为数组 在某些情况下 它还会打印 未知 在某些情况下 它还会格式化某些单元格 然而 这需要很长时间才能完成 有办法改善吗 function move v
  • 生成本地化 javadoc

    我想知道是否有一种生成本地化 javadoc 的简单方法 我想翻译 例如法语 标题和关键字 而不是 html 中的 return parameter class 正如马特 鲍尔所说 你可以提供 localejavadoc 的选项来影响某些事
  • iOS 8 Swift 导航栏标题、按钮未显示在基于选项卡的应用程序中

    我正在尝试跟随本教程 这个答案 and 这个答案在 iOS 8 Swift 中为基于选项卡的应用程序中的每个选项卡创建导航栏 但导航栏上没有显示标题或按钮 这是我到目前为止所拥有的 AppDelegate swift func applic
  • java的日期格式问题

    我从 Joynet 云 API 服务器获取日期格式 2012 11 20T10 26 04 00 00 但是 我不知道如何处理最后一段 00 00 我把除了 00 00以外的格式都做了 SimpleDateFormat fmt new Si
  • 我无法写入 EditText,当我尝试写入内容时它会消失,因为当我修改数据时调用 getView()

    EDIT 我发现原因是当我尝试时 getView 被调用 编辑一些内容 以便加载来自 DataAdapter 的数据并进行我的编辑 变化消失 EDIT 我观察到一件事 如果列表视图中的行数很少 那么它的 好的 但是如果有很多行列表视图无法显
  • 如何将文件写入外部 SD 卡而不是设备存储中?

    我试过这个 public String getFilename File file new File Environment getExternalStorageDirectory Test2 if file exists file mkd
  • 阅读器关闭时尝试读取无效

    我的应用程序有一个通用数据库类 在该类中我有一个函数 public MySqlDataReader getRecord string query MySqlDataReader reader using var connection new
  • Android recyclerView findViewHolderForAdapterPosition 返回 null

    我想以编程方式单击 recyclerView 中的一个项目 我发现a way去做 recyclerView findViewHolderForAdapterPosition 0 itemView performClick 但它对我不起作用
  • 删除灰色 UITableView 索引栏

    我正在使用 UITableView 制作一个应用程序 该应用程序有几个部分 2 当我运行时 表视图的侧面有一个令人讨厌的灰色索引栏 就像 iPod 应用程序中的索引栏一样 只有 2 个选项在里面 我的问题是 如何隐藏 索引栏 因为它是不必要
  • 为什么 const 方法可以采用非 const 引用?

    我知道 const 方法无法修改调用它的对象 看这段代码 class A int a public void f A a const a a 5 int main A x x f x return 0 为什么这段代码可以编译 当将方法声明为
  • 使用 preg_replace 将单词的每个第一个字母大写

    所以我有一些句子通过一些自动更正过程插入到数据库中 下面这句话 sentence Is this dog your s because it can t be mine 下面的代码将每个单词大写 但确保它不大写缩写 例如 n t str r
  • 如何为长时间运行的作业设置自定义 retry_after |拉拉维尔

    问题 如何自定义长时间运行的作业 而无需在每次 retry after 秒后尝试多次 我有一项工作需要 1 到 3 小时才能完成 我已经根据 Laravel 文档创建了基于作业的作业 这是我的作业文件
  • 将数据集导出到 xml 文件,在 DBunit 中出现错误

    大家好 我正在使用 dbunit 工作 我正在尝试将 db 数据集导出到 xml 文件中 import java sql Connection import java sql DriverManager import org dbunit
  • 0,1 上的双字补码的上下文无关语法是什么? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 L ww w 属于 0 1 的补集的 CFG 是多少 首先 请注意以下事实 任何奇怪的单词都是语言的一部分 让我们定义以下语言 L1 w1w w 0 1 L0 w0w w 0 1 这
  • 如何将数据从子级传递给父级?当父级基于类并且子级基于函数时

    我想将数组 字符串 数字等数据从 Child1 Child 组件传递到 App Parent 组件中 父母是基于阶级的 孩子是基于功能的 Parent import React Component from react import App
  • 如何命名和链接在故事板中创建的 IBAction 按钮

    我将按钮命名为 提醒 显然它应该将自己链接到文件 但我的文件中什么也没显示 我在故事板中创建了一个按钮 但我不知道如何将其链接到 m 或 h 文件 我对此真的很陌生并且仍在学习 我是否应该更改按钮的设置以及在文件中编写哪些代码才能使其工作
  • 使用 Powershell 替换文件中的多行文本,而不使用 Regex

    我有以下 Powershell 脚本 oldCode div div newCode div div div div
  • 安装 Firefox 扩展后打开页面

    我正在尝试做类似的事情这个帖子 但是 我正在使用附加 SDK 但似乎找不到方法来执行此操作 在用户安装我的附加组件后 我应该将用于打开页面的代码放在哪里 另外 我想知道是否有一种方法可以在安装后切换附加栏 并在安装后在附加小部件顶部显示一个
  • 如何在网格中找到所有可能的唯一路径?

    我有一个 3 x 3 网格 其中有随机放置的障碍物 其中有一个随机起点但没有终点 当没有更多的单元格可供占用时 将创建端点 移动可以向上 向下 向左或向右 如何查看网格内所有可能的唯一路径 Example 一旦在寻找路径时使用了某个单元 就