几个迷宫和深度优先搜索

时间:2012-03-09 17:57:41

标签: c++ c

我今天学会了DFS,今晚我尝试练习。

我的程序遇到问题。

http://codepad.org/quq5FcwR

void dfs(int x,int y){
  if( maze[x][y]==0 ) maze[x][y]=2;
  if( maze[8][8]==2 ){
    flag=true;
    return;
  }
  if( maze[x+1][y]==0 && x+1<9 ){
    maze[x][y]=2;
    maze[x+1][y]=2;
    dfs(x+1,y);
    if(f lag==false ){
      maze[x+1][y]=0;
      maze[x][y]=0;
    }
  }
  else if( maze[x][y+1]==0 && y+1<9 ){
    maze[x][y]=2;
    maze[x][y+1]=2;
    dfs(x,y+1);                                
    if( flag==false ){
      maze[x][y+1]=0;
      maze[x][y]=0;
    }
  }
  else if( maze[x-1][y]==0 && x-1>0 ){
    maze[x][y]=2;
    maze[x-1][y]=2;
    dfs(x-1,y);                                
    if( flag==false ){
      maze[x-1][y]=0;
      maze[x][y]=0;
    }
  }
  else if( maze[x][y-1]==0 && y-1>0 ){
    maze[x][y]=2;
    maze[x][y-1]=2;
    dfs(x,y-1);                                
    if( flag==false ){
      maze[x][y-1]=0;
      maze[x][y]=0;
    }
  }
  return;
}

1。 链接是我写的程序,但我不知道如何找到最短的路径。

2。 你能给我一些关于如何使用堆栈的建议,我只使用递归。我已经看过关于它的wiki,但仍然不能理解如何使用堆栈。(例如如何使用1-D数组记录点关于2-D数组,我对它很困惑)

感谢您花时间阅读我的问题。

2 个答案:

答案 0 :(得分:2)

最好使用BFS来寻找最短路径,而不是DFS。

您可以使用2个1-D阵列来表示2-D迷宫中的一个点。

我曾经将xq [maxlength],yq [maxlength]作为穿越二维迷宫的队列。

当您想要将新位置(xi,yi)插入队列时

xq[back] = xi;
yq[back] = yi;
back++;

当你想从队列中得到一个点(xp,yp)时,

xp = xq[front];
yp = yq[front];
front++;

最初前面和后面都是0.队列已经完成,你可以使用它做一个BFS。

答案 1 :(得分:1)

在这种情况下,有多点要评论:

1)最简单的堆栈是递归堆栈,您似乎已经在使用它来查看代码。即无论何时从函数dfs()本身调用dfs(),所有变量都将被放入堆栈中。在您的情况下,当您调用x和y时,将保存以便稍后返回。即一旦你从dfs() x回来,你将获得与你之前相同的价值。

2)在返回之前,您必须撤消上一次更改。在功能开始时设置maze[x][y]=2。在你返回之前,你必须撤消这个,因为这个空间可能会导致死胡同。

3)DFS可用于查找内存使用率低的任何路径。但是,DFS找到的路径可能不是最短路径。还有另一种称为BFS的算法可以找到最短的路径,但内存使用率要高得多。然后是迭代DFS,它会找到最短路径,内存消耗低,但需要更多时间。你必须决定你想要什么,然后选择你的算法。