前幾天在markblain的帶領下學習了初步的bfs演算法,然後被逼著寫下這篇總結。
bfs全稱breadth first search,中文名廣度優先搜尋,又稱寬度優先搜尋,和dfs相對。通俗來說dfs是一條路走到底,而bfs就像是把一棟大廈一層一層搜尋。所以正如markblain所說,在做最優路徑(限定:結點到結點的耗費和深度成正比)的題時,廣度優先搜尋一般需要儲存所有結點所以耗費空間大,但找到最優解後直接輸出,耗時較短,深度優先搜尋不需要儲存所有結點,耗費空間較小但是有可能要將全域性都搜尋後再輸出最優解,所以耗時較長。因此,在做題時要考慮到空間限制問題和耗時問題,靈活選擇演算法(ps:我好像並沒有資格說這種話)。
說道bfs最簡單的題就是找最短路(題目鏈結這道題萌新的解法是用鄰接矩陣將相連的兩個結點儲存,然後用鍊錶模擬佇列記錄入隊的結點,按順序來遍歷結點如果找到了就遞迴輸出。這方法雖然比較笨,但是在oj上還是可以a的。下面附上**。
#include#include//f陣列記錄兩個結點是否相連, s陣列記錄結點是否已經入隊;
int f[30][30],s[30];
struct node
;//搜尋最短路徑並輸出
void bfs(int x,int y)//x是起點y是終點
memset(s,0,sizeof(s));
int i,flag=0;
node *head=new node;//靜態鍊錶沒有學好,所以用動態鍊錶模擬佇列
node *p=head,*last=head;
last->data=x;
s[x]=1;
last->next=new node;
while(p->data!=-1)}}
if(flag) break;
p=p->next;//控制迴圈,不然直接死迴圈qaq
}if(flag)
} int main()
bfs(x,y);
}
然後就是營救、水缸灌水等題目,這些題目個人認為都是基於求最短路的基礎之上至於**,因為寫得太難看了就不貼了。
陣列的初步總結
陣列初始化的三種方式 靜態初始化 建立時就直接初始化所有元素 動態初始化 先宣告陣列,然後用到哪個再初始化哪個 預設初始化 每種不同型別的陣列,他都有預設的資料型別,同理陣列也有初始化的型別。public class array01 一次性給陣列所有元素賦值 概述1.陣列大小一經確定無法更改,也就是...
bfs思路總結
1 將初始狀態加入佇列 2 初始狀態出隊,進行節點擴充套件。可能是狀態轉移,列出狀態轉移方程 3 在進行擴充套件中,需要判斷節點不要重複擴充套件。基本思路是設立visited陣列,標記狀態是否被訪問過。將狀態用乙個整數表示,整數則可以是陣列下標,該陣列下標對應的陣列元素的值即是狀態是否被訪問的標誌。...
學習初步總結
字串查詢函式 char strchr char const str,int ch char strrchr char const str,int ch strchr 在字串 str 中查詢字元 ch 第一次出現的位置,找到後函式返回乙個指向該位置的指標。如果該字元並不存在與字串中,函式就返回乙個 n...