bfs(廣度優先搜尋)

2021-10-04 15:23:21 字數 2263 閱讀 7427

這道題很多坑,坑了我一天

1.設定乙個map,防止重複搜尋

2.字串的子串有多處相同,第五個點wa

3.自己**寫的有點亂

4.標誌串不能簡單直接替換,因為把y 換成yz就會死迴圈,要弄個別的字元來替換

5.replace的兩種寫法,迭代器法和下標法

總之:這題很煩

#include

using

namespace std;

string a[8]

,b[8];

struct node

;queueq;

mapint>ma;

//防止重複搜尋

intmain()

q.push()

;//先把起點入隊,開始時cnt=0

while

(!q.

empty()

)//開始搜尋,用佇列實現bfs,當隊列為空還未到終點,則無法達到終點(求最短步數實際上已經保證了一定能到終點)

//找到終點,輸出答案,搜尋結束

//a[tmp.x][tmp.y]='1';//原節點變為"牆"

if(ma[tmp.x]

)continue

;else ma[tmp.x]=1

;for

(int i=

1;i)//四個方向搜尋,尋找可行的下乙個新節點

);}//新節點入隊,並且走到新節點的步數是原節點的步數加一

string str1=tmp.x;

while(1

)); str1[t]

='&';}

}}if(flag==

0)cout<<

"no answer!"

}

經典搜尋題型,運用到回溯

一直納悶這題 咋標記

理解:往兩種方向發展

1.不選這個

2.選這個

#include

using

namespace std;

int n,m,sum,newx,newy,k,fl;

//必須都要定義在前面,養成習慣

int a[35]

;int flag[35]

;int dir[4]

[2]=

,,,}

;void

dfs(

int sum,

int cnt)

if(sum==

0&&cnt!=k)

return

;for

(int i=

1;i<=n;i++)}

intmain()

if(antprintf

("no\n");

//特解直接處理

else

return0;

}

記憶化搜尋,把搜尋結果儲存起來,達到優化時間利用的結果

#include

using

namespace std;

char a[

1001][

1001];

int vis[

1005][

1005

],flag[

1005][

1005];

int num[

1000005];

int n,beginx,beginy,endx,endy,newx,newy,m;

int dir[8]

[2]=

,,,}

;//定義上下左右四個方向

struct node

;queueq;

intmain()

);//先把起點入隊,開始時cnt=0

int cnt=1;

while

(!q.

empty()

)//開始搜尋,用佇列實現bfs,當隊列為空還未到終點,則無法達到終點(求最短步數實際上已經保證了一定能到終點)

);vis[newx]

[newy]

=ant;num[ant]

=max

(num[ant]

,cnt);}

//新節點入隊,並且走到新節點的步數是原節點的步數加一}}

ant++;}

int x,y;

for(

int i=

0;i)return0;

}

BFS廣度優先搜尋

廣度優先搜尋,利用佇列實現,結束標誌是隊列為空的時候 承接dfs的演算法實現的講例,對於迷宮問題我們也可以採取廣度優先搜尋實現 include iostream include cstdio include cstdlib using namespace std int map 55 55 int ...

bfs廣度優先搜尋

這一課我們來學習圖的另一種遍歷方法 廣度優先搜尋 breadth first search,簡稱 bfs 這是一種連通圖的常用遍歷策略,通常用於求起點到各點的最短路徑,以及求兩點之間的最優路徑等問題。首先我們先來看看廣度優先搜尋的具體方法吧 對於乙個連通圖,我們假設一開始所有頂點均未被訪問,廣度優先...

廣度優先搜尋bfs

bfs即廣度優先搜尋演算法,其是搜尋演算法中的一種。1.dfs常用於尋找是否存在解 其從a節點出發,選取乙個臨近點b,然後不斷深入,在搜尋完b的下屬節點 ehif 後,回到a再搜尋臨近a的c節點,以此類推。2.bfs則用於在最短的時間或最少的移動距離內找到解 其往往從a節點出發,搜尋周圍所有的圍繞節...