c++ - 查找通过 4x4 网格的所有路径

标签 c++ algorithm recursion graph big-o

你如何着手解决这个问题::

机器人位于 4x4 网格的左上角。机器人可以上下左右移动,但不能两次访问同一地点。机器人正试图到达网格的右下角。

我的想法:

回溯解决方案,我们遍历所有解决方案的树,并在到达目标单元格后打印。我实现了它,但我不确定它是否正确或有意义,或者它是否是正确的方法。我已在此处发布代码,如果有人能解释其中的问题,我将不胜感激。

递归解决方案,我从起始单元格开始,递归地找到从每个相邻单元格到目标单元格的路径,基本情况是击中目标单元格。

问题:

1)这两种表达方式是同一个意思吗?

2) 这些想法是否有意义?

3) 每个解决方案的时间复杂度是多少?我认为第二个是 4^n?

4) 我的回溯代码有意义吗?

5) 有更简单的方法吗?

这是我的代码,它打印 N = 4 的正确路径数。它正确吗?

#define N 4
int counter = 0;
bool legal_move(int x, int y, int array[N+2][N+2]){
  bool ret = (array[x][y] == 1);
  array[x][y] = 0;
  return ret;
}

/*
void print_array(int array[N+2][N+2]){
  for(int i = 0; i < N+2; i++){
    for(int j = 0; j < N+2; j++)
      cout << array[i][j] << " ";
    cout << endl;
  }
  cout << endl << endl;
}
*/

void print_paths(int x, int y, int n, int m, int array[N+2][N+2]){
  if(x == n && y == m){
    print_array(array);
    counter++;
  }
  else {
    int dx = 1;
    int dy = 0;
    for(int i = 0; i < 4; i++){
      if(legal_move(x + dx, y + dy, array)){
        print_paths(x + dx, y + dy, n, m, array);
        array[x+dx][y+dy] = 1;
      }
      swap(dx,dy);
      if(i == 1)
        dx = -dx;
    }
  }
}

int main(){

  int array[N+2][N+2];

  for(int i = 1; i < N+1; i++)
    for(int j = 1; j < N+1; j++)
      array[i][j] = 1;

  for(int i = 0; i < N+2; i++)
    array[0][i] = array[i][0] = array[N+1][i] = array[i][N+1] = 0;

//print_array(array);
  array[1][1] = 0;  //Set start cell to be seen.
  print_paths(1,1,N,N,array);
  cout << counter << endl;
}

最佳答案

我认为这是同一个想法。

您的代码的问题是您没有正确实现“但不能访问同一地点两次”。

假设您的机器人已经通过某条路径从 S 到达 A,您现在正在检查是否要前往与 A 相邻的 B。测试应该是“机器人之前是否在当前路径上去过 B” '。但是您实现的是“机器人之前是否在任何路径上访问过 B”。

换句话说,您需要修改 print_paths 以获取当前路径的额外参数,并使用它来正确实现测试。

关于c++ - 查找通过 4x4 网格的所有路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19889079/

相关文章:

c++ - 从数组转换为 vector 的边界

javascript - 使用 Google Protocol Buffer 在 C++ 和 JavaScript 端点之间序列化/反序列化数据?

c++ - '/'在一些头文件中的应用

algorithm - 递归算法 - 使用运行总和作为参数?

java - 递归删除数组中所有相邻的重复数字

c++ - typeid 中没有调用函数吗?

algorithm - 亚马逊采访 : Timestamp sorting: Find the three page subset sequence repeated maximum number of times

c++ - 在数组中查找最小值

arrays - 大 2D 位矩阵内大小为 HxW 的最大子数组

javascript - JavaScript 对象中的深度变化值