如何使用条件计算 3D 网格中从一个点到另一个点的所有路径

How to count all paths from a point to another point in 3d grid with conditions

本文关键字:一个 另一个 路径 计算 条件 何使用 3D 网格      更新时间:2023-10-16

给定输入xm,ym,h,我必须在3d网格中找到从点(1,0,1(到(xm,ym,1(的所有路径,例如:

从(x,y,z(可能移动的是(x+1,y,z(,(x+1,y+1,z
  1. (,(x+1,y-1,z(

  2. 如果 Z , y, z+1(, (x+1, y+1, z+1(, (x+1, y-1, z+1(

  3. 如果 z> 1,则更多可能的移动也是 (x+1, y, z-1(, (x+1, y+1,
  4. z-1(,(x+1, y-1, z-1(

我想出了一种适用于 z = 1 的算法,但我不确定如何使其适用于 z 的其他值。任何帮助将不胜感激。

llong countPaths3(int xm, int ym, int h) {
std::pair<int,int> pair1 = {1,0};
std::map<std::pair<int,int>, llong> map1;
map1.insert({pair,1});
int starty = -1;
int endy = 1;
llong value = 0;
for(int x = 2; x <= xm; x++) {
for(int y = starty; y <= endy; y++)
{
if (map1.count({x, y}) == 0) {
value = map1[{x - 1, y}] + map1[{x - 1, y + 1}] + map1[{x - 1, y - 1}];
}
map1[{x, y}] = value;
}
starty--;
endy++;
}
return map1[{xm,ym}];
}

虽然这个问题可以通过组合方式解决,但它也可以使用动态规划来解决,时间和内存复杂度为O(xm * ym * h)

考虑一个 3D 数组,其中数组中索引i, j, k的每个点都表示从(1, 0, 1)(i, j, k)的方法的数量,我们希望找到索引(xm, ym, 1)处的值。

我们需要开始填充数组,
首先填充x = 1层,除了值为 1 的(1, 0, 1)之外,有 0 种方法可以到达所有位置。
第二次填充x = 2图层,除了值为 1 的(2, 0, 1)(2, 1, 1)(2, 0, 2)之外,有 0 种方法可以到达所有位置。
然后填充下一层,以及它上面的一层,依此类推,直到你到达第xm层 - 此时你就完成了。
填充索引(i, j, k)的一般公式为:

A[i, j, k] = 
A[i-1, j-1, k-1] + A[i-1, j-1, k-1] + A[i-1, j-1, k-1] + 
A[i-1, j, k]     + A[i-1, j, k]     + A[i-1, j, k]     + 
A[i-1, j+1, k+1] + A[i-1, j+1, k]   + A[i-1, j+1, k+1]

如前所述 - 使用此公式填充数组需要时间和内存复杂性O(xm * ym * h).

不要忘记检查边缘情况并手动填充第一层。

祝你好运。

相关文章: