C 就來談談深搜與廣搜

2021-07-31 14:01:44 字數 1871 閱讀 3650

下面以一道簡單的搜尋演算法題為例:

在乙個,迷宮中尋找出口,並且要求路徑最短。且迷宮中有障礙物不能穿過,並由規定起點出發。輸入包括三部分,第一行:迷宮的尺寸大小。

第二行:定義迷宮。 第三行:起始位置和出口所在。

#include

int n,m,p,q,min=9999;

int a[51][51],book[51][51];//a用來儲存迷宮,book用來記錄已走過的路徑。

int sum;//記錄所有出口的方式。

void dfs(int x,int y,int step);//深搜函式。

int main()

void dfs(int x,int y,int step)

,,,};//分別定義上下左右四個方向。

int tx,ty,k;//[tx][ty]表示下一步座標,k為了遍歷所有方向

if(x == p && y == q)//判斷是否為出口

sum++;//找到出口sum+1

return;

}for(k=0;k<=3;k++)

if(a[tx][ty] == 0 && book[tx][ty] == 0)//判斷該方向是否可以繼續行走

}return;

}

以上為深搜的實現**,帶有注釋應該是不難理解的。那麼下面就來看看廣搜吧,並從中發現他們的不同所在吧。

#include

struct note//佇列

;int main()

,book[51][51]=;//定義迷宮陣列,book用於記錄哪些點已遍歷過

int next[4][2]=,,,};//分別代表向右,想下,向左,向上

int head,tail;//head表示正擴充套件的結點,tail位於隊尾最後乙個元素的後面隨時將head擴充套件出來的結點入隊

int i,j,k,n,m,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;//如找到終點即flag=1,現在表示未找到終點

while(head < tail)//佇列不為空

if(tx==p && ty==q)//是否找到出口

}if(flag == 1)

break;

head++;//當前節點的擴充套件未有找到出口,搜尋下乙個節點

}printf("%d\n",que[tail - 1].s);//因為tail指向隊尾最後乙個元素的後一位

system("pause");//程式執行完畢,暫停檢查資料

return

0;}

搜尋題大體都是這樣的模板,如果遇到問題仔細考慮,判斷用什麼搜尋方法。祝願各位奮鬥在c**海洋的同胞們有心人終成正果。
淚目°

深搜與廣搜

深搜是一種一條路走到黑,碰壁就倒退的演算法。運用遞迴思想,如果到了不符合條件的節點就撤回一步,然後再選擇另一條路走下去。如果這個節點的所有路徑都走完了,再撤回一步。最簡單的模板 int x 4 int y 4 上下左右四個方向走。也可以八個方向,這裡我就不寫了。void dfs int fx,int...

廣搜與深搜演算法

bfs 廣度優先搜尋 從起點開始,檢視與其相鄰並且滿足題中條件的周圍的所有點 第一層點 然後再以他們為 起點 再去檢視與他們相鄰的第二層的點,一層一層的遍歷,直到找到目標。廣搜一般用於尋找最小路徑等型別題目,因為是層層尋找,所以尋找到的目標一定是最好的解,其大概過程如同一滴水滴到水池產生的水波。但是...

廣搜和深搜

一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數 已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著若是...