1、走迷宮深度優先算法原理
對於圖的遍歷有主要有兩種比較經典的算法,廣度和深度優先遍歷,廣度優先遍歷的關鍵在與構建
遍歷圖的一隊列。具體的深度的原理,一般算法分析的書籍上面都有詳細的說明,簡單的來說就是,深度
優先就是沿着一個方向一直走下去,如果找到出口則輸出路徑,如果沒有找到則回退回來繼續下一路勁,所以對圖的深度搜索用棧存儲就夠比較方便。
2、具體的代碼
代碼是對一個5*6的圖進行的遍歷,圖中1代表障礙,0代表通路,入口(0,1)->出口(3,5)。
從圖中可以看到一共有兩條路徑,我們找出所有的路徑並輸出(因爲本文用的是STL<stack>所以輸出的路徑是反序的,可以參見改進的一篇文章用的是STL 的<list>代替了<stack>)。
1 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
/*+++++++++++++++++++++++++++++++
+ 走迷宮2(C版)
+
+ 深度遍歷算法,輸出所有路經。
+主要思想用棧。
+author:zhouyongxyz 2013-4-14 9:00
++++++++++++++++++++++++++++++++++++++++++*/
#include <cstdio>
#include <algorithm>
#include <stack>
using namespace std;
#define M 5
#define N 6
struct node
{
int x,y;
node(){x=y=0;};
};
int vis[M][N];
static int dx[]={-1,1,0,0};
static int dy[]={0,0,-1,1};
void print_ans(stack<node> s);
int main()
{
int a[M][N]={
{1,0,1,1,1,1},
{1,0,1,0,0,0},
{1,0,0,0,1,0},
{1,1,1,0,0,0},
{1,1,1,0,1,1}
};
stack<node> stack;
struct node u,v;
int flag;
u.x=0,u.y=1;
stack.push(u);
while(!stack.empty())
{
u=stack.top();
if(u.x==3&&u.y==5)
{
print_ans(stack);
vis[u.x][u.y]=0;
/*
回退兩步,這樣代碼容易實現,這也符合正常的邏輯思維,一步就能
到達目的地,沒有必要要繞一大圈。
*/
stack.pop();
stack.pop();
u=stack.top();
}
flag=0;
for(int i=0;i<4;i++)
{
int newx=u.x+dx[i],newy=u.y+dy[i];
if(newx>=0&&newx<M&&newy>=0&&newy<N&&!vis[newx][newy]&&a[newx][newy]==0)
{
v.x=newx;
v.y=newy;
stack.push(v);
flag=1;
vis[newx][newy]=1;
break;
}
}
if(!flag)
stack.pop();
}
return 0;
}
void print_ans(stack<node> s)
{
struct node n;
while(!s.empty())
{
n=s.top();
printf("(%d,%d) ",n.x,n.y);
s.pop();
}
printf("\n");
}