令T(x,y)为X×Y网格上的巡回次数,使得:
很容易看出,例如,T(2,2)= 1,T(3,3)= 2,T(4,3)= 0,T(3,4)= 4。一个计算T(10,4)的程序。
我一直在研究这个问题......我需要一个程序,将网格的尺寸作为输入并返回可能的游览次数?
我一直在研究这个问题......我需要一个程序,将网格的尺寸作为输入并返回可能的游览次数?
我写了这段代码来解决问题......我似乎无法弄清楚如何检查所有方向。
#include <iostream>
int grid[3][3];
int c = 0;
int main(){
solve (0, 0, 9);
}
int solve (int posx, int posy, steps_left){
if (grid[posx][posy] = 1){
return 0;
}
if (steps_left = 1 && posx = 0 && posy = 2){
c = c+1;
return 0;
}
grid[posx][posy] = 1;
// for all possible directions
{
solve (posx_next, posy_next, steps_left-1)
}
grid[posx][posy] = 0;
}
@KarolyHorvath的算法 您需要一些数据结构来表示网格上的单元格状态(访问/未访问)。
您的算法:
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)
答案 0 :(得分:0)
这并不困难,因为你已经获得了算法。为了 解决问题,你可能想要某种动态数据 结构(除非你只对T(10,4)的确切情况感兴趣)。 对于其余部分,左侧在x索引上为-1,右侧为+1,向下为-1 y维度,上升+1。添加边界检查和验证 没有去过,工作就完成了。
但是我想知道这个明显的算法需要花多少时间。有 每个细胞的四方决定;对于T(10,4)的四十个细胞, 这是4 ^ 40的决定。这是不可行的。像消除的东西 已经访问过的单元格和边界检查消除了很多分支, 但仍然......比赛的目标可能是让你找到一个 更好的算法。
答案 1 :(得分:0)
你真的应该选择一个调试器,看看小板(2x2,3x3)上发生了什么。
一个明显的问题是=
是赋值,而不是比较。与==
比较。
还有更多问题。找到他们。