递归查找网格中的所有路径

Recursively finding all paths in a grid

我正在编写一个小程序,在给定一些需要避开的墙壁的情况下,递归地计算网格上到 (0,0) 的所有路径。网格看起来像这样:

 . . . . . . . . . . .
 | . . | . . . . . . .
 . . | . . . . . . . .
 . . - - - . . - - - -
 . | . . . . . | . . .
 . . . . . | . | . . .
 . . . . . . - - . . .
 . - - - . . . | . . .
 . | . . . . . | . . .
 . | . . . . . . . . .
 . . . | . . . . . . O

您必须在路径中不增加到原点的距离的情况下到达原点。

我写了这段代码来查找所有路径:

int recursive_find_path(unsigned int x, unsigned int y, unsigned int distance, std::vector<std::vector<GRID_STATUS> > blocked_grid){
  //if(x>blocked_grid.size()-1 or y>blocked_grid[x].size()-1 or x<0 or y<0 or x+y > distance or blocked_grid[y][x] == GRID_BLOCKED or blocked_grid[y][x] == GRID_TRAVELLED)
  if(x>blocked_grid.size()-1 or y>blocked_grid[x].size()-1 or x<0 or y<0 or x+y<distance or blocked_grid[y][x] == GRID_BLOCKED){
    return 0;
  }
  if(blocked_grid[y][x] == GRID_TRAVELLED){
    return 0;
  }
  if(x==0 and y==0){
    return 1;
  }
  blocked_grid[y][x] = GRID_TRAVELLED; // set position to 'travelled' on to avoid infinite recursion
  return recursive_find_path(x-1,y, distance-1,blocked_grid)+recursive_find_path(x,y-1, distance-1, blocked_grid)+recursive_find_path(x+1,y, distance-1, blocked_grid);
}

注意:GRID_TRAVLLED 和 GRID_BLOCKED 是在程序其他地方定义的值,但本质上只是表示有墙或点的标记已经旅行了。

然而,当运行时,程序输出零路径! 不可否认,我不确定有多少条路径,但我至少可以数出一些,因此它不能为零。

有人知道这里出了什么问题吗?

提前致谢

编辑

 . . . . . . . . . . . . . . . . . . .
 X . . X . . . . . . . . . . . . . . .
 . . X . . . . . . . . . . . . . . . .
 . . X X X . . X X X X . . . . . . . .
 . X . . . . . X . . . . . . . . . . .
 . . . . . X . X . . . . . . . . . . .
 . . . . . . X X . . . . . . . . . . .
 . X X X . . . X . . . . . . . . . . .
 . X . . . . . X . . . . . . . . . . .
 . X . . . . . . . . . . . . . . . . .
 . . . X . . . . . . . . . . . . . . .
 . . . . . . . . . . . . . . . . . . .
 . . . . . . . . . . . . . . . . . . .
 . . . . . . . . . . . . . . . . . . .
 . . . . . . . X . . . . X . . . . . .
 . . . . . . . X . . . . . X X X X X X
 . . . . . . . X . . . . . . . . . . .
 . . . . . . . X . . . . . . . . . . .
 . . . . . . . X . . . . . . . . . X S

使用这个网格,我得到了一个无限循环.... 更新代码:

  if(x>blocked_grid.size()-1 or y>blocked_grid[x].size()-1 or x<0 or y<0 or blocked_grid[y][x] == GRID_BLOCKED){
    return 0;
  }
  if(x==0 and y==0){
    return 1;
  }
  return recursive_find_path(x-1,y,blocked_grid)+recursive_find_path(x,y-1, blocked_grid);
}

让它静置一段时间后 return 540。我几乎可以肯定在这种情况下不可能有 540 条路径

我注意到:

return recursive_find_path(x-1,y, distance-1,blocked_grid)+recursive_find_path(x,y-1, distance-1, blocked_grid)+recursive_find_path(x+1,y, distance-1, blocked_grid);

(x + 1, y) 和 (x - 1, y) 这两个点不能都更接近原点,但是你将 (distance - 1) 传递给这两个递归调用。这将导致许多路径的距离最终等于 -1,然后将 return 0,但在它们 return 0 之前,这些路径将被标记为已走过,尽管这些路径是应该被阻止的虚假路径正在旅行。

您应该只检查靠近原点的路径,即 (x -1, y) 和 (x, y - 1)