设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运行步骤( 0,0,sizex*sizey)
发布于 2012-03-19 18:55:57
这并不难,因为你已经得到了算法。为了解决这个问题,您可能需要某种动态数据结构(除非您只对T(10,4)的确切情况感兴趣)。其余的是x索引的左-1,右+1,y维的向下是-1,向上+1。添加没有访问过的边界检查和验证,任务就完成了。
但我不知道这样一个明显的算法需要多长时间。每个单元格有一个四向决定;对于T(10,4)的40个单元,是4^40个决定。这是不可能的。例如消除已经访问过的单元格和边界检查会消除许多分支,但仍然.比赛的目的可能是让你找到一个更好的算法。
发布于 2012-03-19 23:15:54
你真的应该选择一个调试器,看看在一个小板(2x2,3x3)上发生了什么。
一个明显的问题是,=是赋值,而不是比较。与==进行比较。
还有更多的问题。找到他们。
https://stackoverflow.com/questions/9775548
复制相似问题