走迷宮1(廣度優先)

1、走迷宮廣度優先算法原理
對於圖的遍歷有主要有兩種比較經典的算法,廣度和深度優先遍歷,廣度優先遍歷的關鍵在與構建
遍歷圖的一隊列。具體的廣度的原理,一般算法分析的書籍上面都有詳細的說明,簡單的來說就是,廣度
優先就是先對圖中一個點的周圍的相鄰的點都處理完了之後,在依次處理周邊的點,所以對圖的廣度搜索
用隊列存儲就夠比較方便。深度自然用棧比較好。深度的遍歷的代碼在其他的兩篇博客中:
2、具體的代碼
代碼是對一個5*6的圖進行的遍歷,圖中1代表障礙,0代表通路,入口(0,1)->出口(3,5)。
從圖中可以看到一共有兩條路徑,我們找出的是最優的路徑,即最短的路徑。
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

/*+++++++++++++++++++++++++++++++
+ 走迷宮(C版)
+
+ 廣度優先遍歷算法,找出最優路勁。
+author:zhouyongxyz2013-4-13 21:50
++++++++++++++++++++++++++++++++++++++++++*/
#include <cstdio>

#define M 5
#define N 6
struct node
{
int x,y;
int fa;
node(){x=y=fa=0;};
}q[M*N];
int vis[M][N];
static int dx[]={-1,1,0,0};
static int dy[]={0,0,-1,1};

void print_ans(int idx);
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}
};
int front=0,rear;
q[front].x=0;
q[front].y=1;
rear=1;
while(front<rear)
{
node& u=q[front];
if(u.x==3&&u.y==5)
{
print_ans(front);
break;
}
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)
{
node& v=q[rear];
v.x=newx;
v.y=newy;
v.fa=front;
rear++;
}
}
front++;
}
return 0;
}
void print_ans(int idx)
{
if(q[idx].fa!=idx)
print_ans(q[idx].fa);
printf("(%d,%d)->",q[idx].x,q[idx].y);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章