一:BFS概念
寬度優先搜索算法(又稱廣度優先搜索)是最簡便的圖的搜索算法之一,這一算法也是很多重要的圖的算法的原型。Dijkstra單源最短路徑算法和Prim最小生成樹算法都采用了和寬度優先搜索類似的思想。其別名又叫BFS,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜索整張圖,直到找到結果為止。
所謂廣度,就是一層一層的,向下遍歷,層層堵截,還是這幅圖,我們如果要是廣度優先遍歷的話,我們的結果是V1 V2 V3 V4 V5 V6 V7 V8。
1、訪問頂點vi ;
2、訪問vi 的所有未被訪問的鄰接點w1 ,w2 , …wk ;
3、依次從這些鄰接點(在步驟②中訪問的頂點)出發,訪問它們的所有未被訪問的鄰接點; 依此類推,直到圖中所有訪問過的頂點的鄰接點都被訪問;
問題實例:
#include<stdio.h> struct note{ int x; //x坐標 int y; //y坐標 int f; //隊列標號 int s; //步數 }; int main() { struct note que[2501]; //地圖大小不會超過50*50 int book[51][510]={0}; //記錄步數,防止一個點被重復走 int a[51][51]={0}; //用來存儲步數 //定義一個走的數組 int next[4][2]={ {0,1},//右走 {1,0},//左走 {0,-1},//上走 {-1,0}, //下走 }; int startx,starty,q,p,i,j,k,head,tail,tx,ty; //起點坐標 終點橫縱坐標 int n,m; //迷宮的縱橫數 int flag; scanf("%d %d",&n,&m); //輸入棋譜 for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&a[i][j]); } } //輸入起始坐標和終點坐標 scanf("%d %d %d %d",&startx,&starty,&p,&q); //隊列的初始化 head = 1; tail = 1; //往隊列中插入入口坐標 que[tail].x = startx; que[tail].y = starty; que[tail].s = 0; que[tail].f = 0; tail++; book[startx][starty] = 1; flag = 0; while(head<tail){ for(k=0;k<=3;k++) { //枚舉四個方向 tx = que[head].x + next[k][0]; ty = que[head].y + next[k][1]; if(tx<1 || ty<1 || tx>n || ty>m) continue; if(a[tx][ty] == 0&& book[tx][ty] == 0) { book[tx][ty] = 1; //標記為已走過 que[tail].x = tx; que[tail].y = ty; que[tail].s = que[head].s + 1; tail++; } if(tx == p && ty == q) { flag = 1; break; } } if(flag == 1) break; head++; } printf("%d",que[tail-1].s); getchar();getchar(); return 0; }
運行結果: