廣度優先搜尋(C語言例項)
阿新 • • 發佈:2019-01-01
我們得到一個二維陣列,這個為維陣列就像當一個座標一樣,它的上邊有障礙物(在有障礙物的地方我們用1來表示,沒障礙物的地方用0來表示),使用廣度優先搜尋,我們就要用到佇列,具體的思路就是如下虛擬碼
虛擬碼: void BFS(Vertex V){ //從V這個頂點開始遍歷 visited[V]=true; //先對V進行確認 Enqueue(V,Q); //將V壓入佇列中 while(!IsEmpty){ V=Dequeue(Q); //將佇列中的彈出 for(V的每一個鄰接點W){ if(!visted[w]){ visted[w]=true; Enqueue(V,Q); //將V壓入佇列中 } } } }
這裡使用例項來描述
#include<stdio.h> struct note{ int x;//橫座標 int y;//縱座標 int f;//父在佇列中的編號 int s;//步數 }; int main(){ struct note que[2501];//建立佇列 int a[51][51]={0},book[51][51]={0}; //定義方向的陣列 int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int head,tail; int i,j,m,n,startx,starty,p,q,tx,ty,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].f=0; que[tail].s=0; tail++; book[startx][starty]=1; flag=0;//用來標記是否到達 //判斷佇列 while(head<tail){ //向著四個方向出發 for(i=0;i<4;i++){ tx=que[head].x+next[i][0]; ty=que[head].y+next[i][1]; if(tx<1||tx>n||ty<1||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].f=head; 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); }