令 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) 运行