C ++简单但无法解决?我想不是

时间:2012-03-19 18:12:36

标签: c++ recursion backtracking

令T(x,y)为X×Y网格上的巡回次数,使得:

  1. 游览从左上角开始
  2. 巡视包括向上,向下,向左或向右移动 方
  3. 巡回演出恰好访问每个广场一次,
  4. 游览结束于左下方。
  5. 很容易看出,例如,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)

2 个答案:

答案 0 :(得分:0)

这并不困难,因为你已经获得了算法。为了 解决问题,你可能想要某种动态数据 结构(除非你只对T(10,4)的确切情况感兴趣)。 对于其余部分,左侧在x索引上为-1,右侧为+1,向下为-1 y维度,上升+1。添加边界检查和验证 没有去过,工作就完成了。

但是我想知道这个明显的算法需要花多少时间。有 每个细胞的四方决定;对于T(10,4)的四十个细胞, 这是4 ^ 40的决定。这是不可行的。像消除的东西 已经访问过的单元格和边界检查消除了很多分支, 但仍然......比赛的目标可能是让你找到一个 更好的算法。

答案 1 :(得分:0)

你真的应该选择一个调试器,看看小板(2x2,3x3)上发生了什么。

一个明显的问题是=是赋值,而不是比较。与==比较。

还有更多问题。找到他们。