gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:17:15 27 4
gpt4 key购买 nike

我正在写一个推箱子求解器来娱乐和练习,它使用一个简单的算法(有点像 BFS 有点不同)。

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

有效路径:

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

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

alt text http://megapic.ir/images/f1hgyp5yxcu8887kfvkr.png

但这不是:

alt text http://megapic.ir/images/wnnif13ir5gaqwvnwk9d.png

需要一种方法来计算两个顶点ab 之间的所有非循环路径的计数。

欢迎评论解决方法和技巧。

最佳答案

不是一个解决方案,但也许您可以进一步思考这个想法。问题是您还需要计算获得所有路径的最长可能路径。 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 矩阵的任何位置到右下角的所有可能路径,然后使用该矩阵快速查找路径数。 Dynamic programming (使用之前的计算结果)可以加快速度。

关于c++ - 从 A[a,b] 到 A[c,d] 的不同非循环路径的计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2500877/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com