【问题标题】:How to count all paths from a point to another point in 3d grid with conditions如何在有条件的情况下计算 3d 网格中从一个点到另一个点的所有路径
【发布时间】:2020-10-01 15:49:50
【问题描述】:

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

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

  2. 如果 z

  3. 如果 z > 1 更多可能的移动也是 (x+1, y, z-1), (x+1, y+1, 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}];
}

【问题讨论】:

  • 排列计数似乎足够了。
  • 您能详细说明一下吗?
  • 路径长度为xm。 y/z 是不相关的,因此您可以将 y0-ym 和 z0-zm 的方式相乘。
  • 我的想法是计算n1 + ym递增、n1递减和xm - 2 * n1“noop”的排列。所以 IIRC,(xm!)/(n1!*(n1+ym)!*(xm - 2 * n1)!.
  • n1 代表什么?

标签: c++ algorithm path point


【解决方案1】:

虽然这个问题可以组合解决,但也可以使用Dynamic Programming 来解决,时间和内存复杂度为O(xm * ym * h)

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

我们需要开始填充数组,
首先填充x = 1层,除了(1, 0, 1)的值为1之外,有0种方法可以到处获取。
第二次填充x = 2层,除了(2, 0, 1)(2, 1, 1)(2, 0, 2)的值为1之外,有0种方法可以到处获取。
然后填充下一层,以及它上面的一层,依此类推,直到到达xmth 层-此时您已完成。
填写索引(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) 的时间和内存复杂度。

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

祝你好运。

【讨论】:

  • 一些技术说明:为了充分utilize the cache of the computer,哪个索引代表x层很重要。
  • 我想过类似的事情,但是对于 x = 2,我得到 (2, 0, 1), (2, 1, 1), (2, -1, 1)。如何处理负值?
  • "不要忘记检查边缘情况" 检查 yz 是否超出范围,如果超出则从总和中删除无效元素。
  • 对于 xm = 3, ym = 0, h = 1 (3,0,1) 我应该得到答案 3 - 它可以从 (2,0,1), (2,1 ,1) 和 (2,-1,1) 所以 (2,-1,1) 应该被计算在内。
  • 哦,对不起,现在我明白你在说什么了......现在处理起来有点困难,但没什么太严重的,y 维度实际上应该是2 * xm 的大小,其中第一个xm 是负值,正确的是正值。
猜你喜欢
  • 2019-08-09
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多