【问题标题】:Counting paths from center of square to edge计算从正方形中心到边缘的路径
【发布时间】:2012-10-29 10:00:39
【问题描述】:

假设我有一个大小为 (2n+1)x(2n+1) 的正方形,对于一些 n,即一个边长奇数的正方形。
从最中心的单元格开始,我有兴趣计算编号。到达任意边缘单元的方式(如下图所示)。
只允许不重叠的路径,即如果一个单元格已经被访问过,我们就不能重新访问它。

下图显示了一个边长为 9(n=4) 的正方形和两条长度为 5 的可能路径。

我认为所有路径的长度范围都是:[n 到 (2n-1)^2+1 ]
数着没有。长度路径:
1 - 0
2 - 0
3 - 0
4 - 4
5 - 32
6 - ...?
但是随着路径长度的增加,我似乎无法解开所有的可能性。我知道对称性在这里起作用,但是有没有结构化的方法来计算所有路径?

谢谢,

【问题讨论】:

    标签: algorithm logic permutation combinations combinatorics


    【解决方案1】:

    要查找从方板中心开始并在边界处结束的路径,您可以使用经过调整的 DFS (Depth First Search) 来存储已访问过的图块,这样您就不会再踩到它们了。

    棋盘确实有很多对称性。您只需注意以下几点即可将搜索到的路径数除以 4:

    • 从中心出发,可以去UpDownLeft Right
    • Up 开始的所有路径都会生成以 DownLeftLeft 开始的所有其他路径strong>Right 轮换

    一旦你这样做了,你可以进一步注意到:

    • 离开后U,您可以转到ULR
    • 你去L时生成的所有路径都是镜像对称去R时生成的路径。

    您可以重复几次,直到到达正方形的边界。从 U 开始的全部路径将是:

    • U-U-U-U(一条路径)
    • 2 次以 U-U-U-L 开头的路径
    • 2 次以 U-U-L 开头的路径
    • 2 次以 U-L 开头的路径

    计算完这些,乘以 4 即可得到全部路径。

    【讨论】:

    • 感谢您的建议。根据您的对称论点,我认为我们可以有把握地得出结论,以upper half of right-most boundary wall 结尾的每条路径(实际上,任何边界墙的任何半段)都可以以 8 对称方式反映。 (除了从正方形中心到 4boundary 墙中心的 4 条直线路径)我已经写了这个天真的 DFS code,所以有没有一种有效的方法来限制/修剪 DFS 来搜索仅以say结尾的路径-upper half of right most wall?从而将运行时间提高了 8 倍。
    • 实际上你不能使用对称参数 prune by end point 因为这意味着你最终只探索开始向上并在上半部分结束的路径最右边的墙。要么你选择像我的回答那样按起点修剪,要么按终点修剪。按起点修剪要快得多,因为您无法知道路径是否会在最右边墙的上半部分之外结束,除非它在错误的位置结束,这意味着您无论如何都探索了所有路径。
    • 是的,看起来从头开始修剪是正确的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多