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

C++ Simple but unsolvable? I think not

本文关键字:解决 简单 C++      更新时间:2023-10-16

设T(x,y)为x×y网格上的巡视次数,使得:

  1. 游览从左上角的广场开始
  2. 巡回赛包括向上、向下、向左或向右的动作正方形
  3. 参观团每一个广场只参观一次
  4. 游览在左下角的广场结束

例如,很容易看出,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)

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

但我想知道这样一个显而易见的算法需要多少时间。有每个小区的四路决策;对于T(10,4)的40个细胞,这是4^40的决定。这是不可行的。比如消除已经访问的小区和边界检查消除了许多分支,但是。。。比赛的目标可能是让你找到更好的算法。

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

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

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