如何使用条件计算 3D 网格中从一个点到另一个点的所有路径
How to count all paths from a point to another point in 3d grid with conditions
给定输入xm,ym,h,我必须在3d网格中找到从点(1,0,1(到(xm,ym,1(的所有路径,例如:
从(x,y,z(可能移动的是(x+1,y,z(,(x+1,y+1,z(,(x+1,y-1,z(
如果 Z , y, z+1(, (x+1, y+1, z+1(, (x+1, y-1, z+1(
如果 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}];
}
虽然这个问题可以通过组合方式解决,但它也可以使用动态规划来解决,时间和内存复杂度为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)
.
不要忘记检查边缘情况并手动填充第一层。
祝你好运。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如何在C++中将函数发送到另一个进程
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口