我今天学会了DFS,今晚我尝试练习。
我的程序遇到问题。
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数组,我对它很困惑)
感谢您花时间阅读我的问题。
答案 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,它会找到最短路径,内存消耗低,但需要更多时间。你必须决定你想要什么,然后选择你的算法。