關於廣度優先搜尋的理解
阿新 • • 發佈:2019-01-01
廣度優先搜尋是一圈一圈的搜尋,直到遍歷圖,
2 7
3 0 1 5
4 6
從0開始搜尋順序(右下左上):1,4,3,2,5,6,7 利用book陣列將已經遍歷過的點記錄,以後不再遍歷,廣度優先搜尋用的是佇列,而深度優先搜尋用的是遞迴.
基本上廣度能做的深度也能做
但是:
比較深度優先和廣度優先兩種搜尋法,廣度優先搜尋法一般無回溯操作,即入棧和出棧的操作,所以執行速度比深度優先搜尋演算法法要快些。
總之,一般情況下,深度優先搜尋法佔記憶體少但速度較慢,廣度優先搜尋算法佔記憶體多但速度較快,在距離和深度成正比的情況下能較快地求出最優解。因此在選擇用哪種演算法時,要綜合考慮。決定取捨。
以下是一個《啊哈!演算法》中的一題 P113,尋找獨立的小島.
資料(10行10列):
1 2 1 0 0 0 0 0 2 3
3 0 2 0 1 2 1 0 1 2
4 0 1 0 1 2 3 2 0 1
3 2 0 0 0 1 2 4 0 0
0 0 0 0 0 0 1 5 3 0
0 1 2 1 0 1 5 4 3 0
0 1 2 3 1 3 6 2 1 0
0 0 3 4 8 9 7 5 0 0
0 0 0 3 7 8 5 0 1 2
0 0 0 0 0 0 0 0 1 0
#include <stdio.h> struct node { int x; int y; }; struct node que[200]; //佇列 int sum = 1;//本題無用 int Map[11][11]; //地圖資料 int book[50][50]={0}; //標記陣列 int next[4][2]={{1,0},{0,1},{-1,0},{0,-1}};//右下左上 int flag =0;//判斷是否找到了一個島找到了置為1,如果為1 num--; int num =-1; //島嶼標號 int main() { freopen("test.txt","r",stdin); //重定向 int i,j,startx=0,starty=0,head=1,tail=1,tx,ty,k; int n=10,m=10; for(i = 0 ;i<n;i++) for(j=0;j<m;j++) scanf("%d",&Map[i][j]); que[tail].x = startx; que[tail].y = starty; tail++; for(i=0;i<10;i++) { for(j=0;j<10;j++) //迴圈每一個點 { que[head].x=i; que[head].y=j; while(head<tail && Map[que[head].x][que[head].y]!=0) //不用找(0,0)的點 { for(k=0;k<4;k++) //四個方向 { tx = que[head].x+next[k][0]; //得到下一個點 ty = que[head].y+next[k][1]; if(tx<0||tx>9||ty>9|| Map[tx][ty]==0||ty<0) //為0不往下走,直接判斷另一個點 continue; if(Map[tx][ty]>0 && Map[tx][ty]<10 && book[tx][ty]==0) //1~9為島嶼 並且判斷是否被遍歷過,防止重複 { //printf("%d,%d\n",tx,ty); book[tx][ty]=1; //標誌遍歷過 que[tail].x = tx; //將佇列下一個寫入資料 que[tail].y = ty; Map[tx][ty]=num; //把同一個島嶼數字更改為num flag =1; //找到了島嶼 tail++; //尾++ } } head++; //頭++,一定要寫的. } if(flag == 1) {num--; flag=0;} tail++;//一個島嶼找完後,尾++,讓迴圈能夠繼續. } } for(i=0;i<10;i++) //輸出 { for(j=0;j<10;j++) printf("%4d",Map[i][j]); printf("\n"); } printf("%d\n",-num-1); //輸出島嶼個數 return 0; }