从 A[a,b] 到 A[c,d] 的不同非循环路径的计数?

2024-02-19

我正在编写一个推箱子求解器,用于娱乐和练习,它使用一个简单的算法(类似于 BFS,但略有不同)。

现在我想估计它的运行时间(O 和 omega)。但需要知道如何计算网络中从一个顶点到另一个顶点的非循环路径的计数。 实际上我想要一个表达式来计算 m*n 顶点矩阵的两个顶点之间的有效路径数。

有效路径:

  • 访问每个顶点 0 次或 1 次。
  • 没有电路

例如,这是一个有效的路径:

替代文本 http://megapic.ir/images/f1hgyp5yxcu8887kfvkr.png http://megapic.ir/images/f1hgyp5yxcu8887kfvkr.png

但这不是:

替代文本 http://megapic.ir/images/wnnif13ir5gaqwvnwk9d.png http://megapic.ir/images/wnnif13ir5gaqwvnwk9d.png

需要一种方法来查找两个顶点之间所有非循环路径的计数a and b.

欢迎对解决方法和技巧提出意见。


这不是一个解决方案,但也许你可以进一步思考这个想法。问题是您还需要计算最长的可能路径才能获得所有路径。这最长路径问题 http://en.wikipedia.org/wiki/Longest_path_problem对于一般图来说是 NP 完全的,因此即使对于相对较小的图(8x8 或更大)也会花费很长的时间。

想象一下起始顶点位于矩阵的左上角,结束顶点位于矩阵的右下角。

  • 对于 1x2 矩阵,只有 1 条可能的路径
  • 2x2 矩阵 => 2***1** 路径 => 2
  • 3x2 矩阵 => 2***2** 路径 => 4
  • 3x3 矩阵 => 2***4** + 2*2 路径 => 12
  • 3x4 矩阵 => 2***12** + 12 + 2 条路径 => 38

每次我都会将先前计算的结果合并为当前路径数。对于这样的平面图,可能有一个紧密的公式,甚至可能有很多理论,但我太愚蠢了......

您可以使用以下 Java(抱歉,我不是 C++ 专家:-/)片段来计算较大矩阵的可能路径:

public static void main(String[] args) {
    new Main(3, 2).start();
}
int xSize;
int ySize;
boolean visited[][];

public Main(int maxX, int maxY) {
    xSize = maxX;
    ySize = maxY;
    visited = new boolean[xSize][ySize];
}

public void start() {
    // path starts in the top left corner
    int paths = nextCell(0, 0);
    System.out.println(paths);
}

public int nextCell(int x, int y) {
    // path should end in the lower right corner
    if (x == xSize - 1 && y == ySize - 1)
        return 1;

    if (x < 0 || y < 0 || x >= xSize || y >= ySize || visited[x][y]) {
        return 0;
    }

    visited[x][y] = true;
    int c = 0;
    c += nextCell(x + 1, y);
    c += nextCell(x - 1, y);
    c += nextCell(x, y + 1);
    c += nextCell(x, y - 1);
    visited[x][y] = false;
    return c;
}

=>

  • 4x4 => 184
  • 5x5 => 8512
  • 6x6 => 1262816
  • 7x7(即使是这个简单的情况也需要很多时间!)=> 575780564

这意味着您可以(仅在理论上)计算从 MxM 矩阵的任意位置到右下角的所有可能路径,然后使用该矩阵快速查找路径数。动态规划 http://en.wikipedia.org/wiki/Dynamic_programming(使用之前的计算结果)可以稍微加快速度。

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

从 A[a,b] 到 A[c,d] 的不同非循环路径的计数? 的相关文章

随机推荐

  • 带有模板参数的模板中的默认值 (C++)

    假设我有一个模板 称为 ExampleTemplate 它接受两个参数 容器类型 例如列表 向量 和包含类型 例如 float bool 等 由于容器实际上是模板 因此该模板有一个模板参数 这就是我必须写的 include
  • python 异常。UnicodeDecodeError: 'ascii' 编解码器无法解码字节 0xa7

    我正在将 scrapy 与 python 结合使用 并且在 python item pipline 中有此代码 def process item self item spider import pdb pdb set trace ID st
  • Django 表单 - 验证错误后重新加载时变量类型发生变化

    我花了一些时间 但无法找出以下行为的确切原因 我有一个 Django 表单 在模板中我试图查看列表中是否存在整数 然后用它做一些事情 if pk in form area value form area value is a list li
  • 有没有办法设置X轴的背景颜色

    我检查了文档 我能找到的只是设置笔划 但我需要整个 x 轴背景不仅仅是字体颜色 Renaldo Balaj 好吧 你可以像这里一样向你的图表添加一个 svg 元素 https codesandbox io s highlight zomm
  • 如何比较两个日期[重复]

    这个问题在这里已经有答案了 我有一个带有 PHP 前端的 MySQL 数据库 在我的记录中 我有一个直接从数据库访问的发布日期和到期日期 我需要做的是检查并查看是否有任何记录的过期日期与发布日期相符 就像是 你可以这样做 posted da
  • LiveData 观察者未调用

    我有一个活动 TabBarActivity承载一个片段 EquipmentRecyclerViewFragment 片段收到 LiveData 回调 但 Activity 没有 在调试模式下使用断点进行证明 奇怪的是 如果我调用 ViewM
  • dyld:惰性符号绑定失败:找不到符号:_PQsetErrorContextVisibility

    跑步时 psql 我收到这个错误 dyld lazy symbol binding failed Symbol not found PQsetErrorContextVisibility Referenced from usr local
  • 未定义引用错误,无法创建共享库

    尝试了很多方法来解决问题但没有运气 这是我的 Android mk LOCAL PATH call my dir include CLEAR VARS LOCAL MODULE avcodec LOCAL SRC FILES libavco
  • 什么是最好的:每条记录 1 个表,还是 1 个表中所有记录都与外键链接?

    我有一个应用程序 可以让用户创建不同的表单 调查 然后填写它们 所以它是纸张的替代品 这是我在应用程序中使用的当前模型 Table 1 SURVEYS TABLE ID name description Table 2 name of th
  • 会话与会话工厂之间的区别 - Hibernate?

    除了以下几点之外 我们还有其他差异吗 另请验证以下是否正确 SessionFactory每个应用程序都有一个对象 并且Session每个客户只有一个对象 SessionFactory是创建和管理Sessions Session就是提供一个C
  • Android TableLayout 不垂直滚动

    预先感谢您的任何帮助 我对 Android 很陌生 这是我的问题 我正在使用 TableLayout 来显示可编辑字段 大约有二十行要显示 在较小的设备上 行会溢出屏幕 我需要视图允许用户上下滚动 我缺少什么 尝试将 TableLayout
  • 在windows上打开指定目录下的Cygwin命令

    我使用 phpstorm 和它的终端设施 在终端部分我输入F Projects cygwin64 bin mintty exe i Cygwin Terminal ico 所以它使用 Cygwin 作为终端 但它会在主文件夹中打开它 是否可
  • XML 不可能是整个程序

    当我包含以下 js 文件 其中包含 jquery 时 我在 Firebug 中收到错误 XML 不能是整个程序 JS文件包含参考 JS文件内容 id txtAddress1S blur function id txtAddress1S va
  • WPF 中延迟后重置变量值

    我有一些执行并获取执行返回值的代码 我将此值设置为窗口的依赖属性 因为有样式触发器绑定到它 当变量为 0 时 使用默认样式 1 时使用偏红色样式 2 时使用绿色样式 但一段时间后我必须以某种实际的方式重置这种风格 做到这一点最简单的方法是什
  • High Sierra 中的 NSCollectionView 内存泄漏?

    我通过 Instruments 注意到 NSCollectionView 中存在内存泄漏 当我追踪代码时 它显示了下面的特定行 collectionView makeItem withIdentifier identifier for in
  • Python 变量声明

    我想澄清一下 Python 中如何声明变量 我见过变量声明 https www learnpython org en Variables and Types as class writer path 有时 没有显式声明 而只是使用初始化 i
  • 如何通过 XPath 选择第一个元素?

    我有以下 HTML 结构 div class carousel ul class carousel view li li ul div
  • 如何解决Hibernate“未能延迟初始化角色集合”异常

    我有这个问题 org hibernate LazyInitializationException 未能延迟初始化角色集合 mvc3 model Topic comments 没有会话或会话被关闭 这是模型 Entity Table name
  • 如何转义包含空格的路径

    要将带有空格的路径传递给 NET 控制台应用程序 您应该转义它 可能不是转义而是用双引号引起来 myapp exe path C Program Files MyApp becomes new string path C Program F
  • 从 A[a,b] 到 A[c,d] 的不同非循环路径的计数?

    我正在编写一个推箱子求解器 用于娱乐和练习 它使用一个简单的算法 类似于 BFS 但略有不同 现在我想估计它的运行时间 O 和 omega 但需要知道如何计算网络中从一个顶点到另一个顶点的非循环路径的计数 实际上我想要一个表达式来计算 m