通过m x n网格的巡视次数
Number of tours through m x n grid?
设T(x,y)为x×y网格上的巡视次数,使得:
- 游览从左上角的广场开始
- 巡回赛包括向上、向下、向左或向右一个正方形的动作
- 参观团每一个广场只参观一次
- 游览在左下角的广场结束
例如,很容易看出,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容器),那么您应该遵循他的提示,这在任何情况下都是一个很好的提示。
相关文章:
- 通过方法访问结构
- 通过递归进行因子分解
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 尝试通过多个向量访问变量时,向量下标超出范围
- C++如何通过用户输入删除列表元素
- 通过多个头文件使用常量变量
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何通过派生类函数更改基类中的向量
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- Ctypes wstring通过引用传递
- 变量没有改变?通过向量的函数调用
- 如何通过cpp程序运行shell脚本
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- QT通过C++添加映射QML项目
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 循环通过网格获取温度,但不知道如何告诉程序停止循环
- 如何解决数独问题,以便通过交换任何两个相邻的子网格,我仍然得到有效的答案?
- 通过m x n网格的巡视次数