通过m x n网格的巡视次数

Number of tours through m x n grid?

本文关键字:网格 通过      更新时间:2023-10-16

设T(x,y)为x×y网格上的巡视次数,使得:

  1. 游览从左上角的广场开始
  2. 巡回赛包括向上、向下、向左或向右一个正方形的动作
  3. 参观团每一个广场只参观一次
  4. 游览在左下角的广场结束

例如,很容易看出,T(2,2)=1,T(3,3)=2,T(4,3)=0,T(3,4)=4。编写一个程序来计算T(10,4)。

  • 我已经做了好几个小时了。。。我需要一个程序,将网格的维度作为输入,并返回可能的旅行次数?你知道我该怎么解决这个问题吗

由于你是回溯的新手,这可能会让你知道如何解决这个问题:

您需要一些数据结构来表示网格上单元格的状态(已访问/未访问)。

您的算法:

step(posx, posy, steps_left)
    if it is not a valid position, or already visited
        return
    if it's the last step and you are at the target cell
        you've found a solution, increment counter
        return
    mark cell as visited             
    for each possible direction:
       step(posx_next, posy_next, steps_left-1)
    mark cell as not visited

并使用运行

step(0, 0, sizex*sizey)

回溯的基本构建块是:评估当前状态、标记、递归步骤和取消标记。

这对小木板来说效果很好。真正有趣的是从更大的木板开始,你必须在树上砍下无法解决的树枝(例如:有一个无法到达的未访问细胞区域)。

分配的练习很好。它迫使你一步一步地思考几个概念。我不能帮你把所有的概念都想清楚,但也许我可以问以下问题来帮助你。

在某个时刻,您的程序必须代表部分完成的巡回演出也就是说,它必须表示一条尚未穿过所有正方形且尚未到达左下角目标的路径,但如果稍后扩展该路径,则这两种情况都可能发生。您的意思是如何表示部分完成的巡演

如果你能回答这个问题,如果你掌握了递归的概念,那么人们就会怀疑你可以通过一些工作来解决这个问题,但不会遇到太多真正的麻烦。代表部分完成的巡演是你的障碍,所以我建议你去做这件事。

更新:请参阅下面@KarolyHorvath的评论。如果您还没有学会动态分配内存的使用(或者,等效地,还没有学会像std::vector和std::list这样的STL容器),那么您应该遵循他的提示,这在任何情况下都是一个很好的提示。