【发布时间】:2020-10-01 15:49:50
【问题描述】:
鉴于输入 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
如果 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 代表什么?