日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

广度优先搜索(BFS)

發布時間:2023/11/30 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 广度优先搜索(BFS) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

廣度優先

Description:

阿貍被困在迷宮,snoopy要去救他,snoopy可以向上、下、左、右四個方向行走,每走一步(格)就要喝掉一瓶益力多。現在給它一個迷宮地圖請問:snoopy最少需要多少瓶益力多才能走出迷宮?

Input:

先輸入一個數t,表示測試的數據個數, 下面輸入的就是t個迷宮, 每個迷宮的輸入都應包含以下數據, 輸入迷宮的大小 n(n<=15),表示迷宮大小為n*n。 再輸入迷宮, 用大寫字母“S”表示snoopy的位置, 用小寫字母“E”表示阿貍被困的位置, 用“.”表示空白, 用“*”表示障礙, 你知道的阿貍和snoopy都只有一個。

Output:

輸出需要的最少的益力多的瓶數m(數據保證一定有最少需要的利益多的瓶數) Sample Input:

2
8
S..*....
.*...**.
..*.**..
.*..*..*
*..*E.**
........
.***..*.
....*...
8
S..*....
.*...**.
.**.**..
.*..*..*
*..**.**
........
.***..*.
....*..E

Sample Output:

12

16

?

題意分析:這題是最簡單的求最短距離的題目,也就是典型的BFS問題。

廣度優先搜索:http://baike.baidu.com/view/288267.htm 如果不想看這么長的文字解釋,可以看一下下面的PPT:http://www.docin.com/p-542536008.html?

下面繼續分析這道題目,我們挑選第二組數據進行分析。首先,我先把數據從數組下標為[1][1]的地方開始存儲。讓后在地圖的周圍“造”一堵墻(如圖1)。我們還需要開一個跟地圖一樣大的數組visit來記錄已經走過的點。將所有點初始化為0,走過的點記為1。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ?圖1                        圖2                        圖3

?然后記錄S的坐標。將S入隊并標記visit[s.x][s.y]=1,查看S點是否等于E,不等,將隊首元素pop出去;否則返回結果。然后查看與S相鄰的上下左右4點(上下左右的順序隨便),如果該點不是墻(即'*')并且之前沒走過(visit[該點.x][該點.y]等于0),則將該點入隊,標記visit[該點.x][該點.y]=1;否則不做處理。相鄰的點都查看完后,再取隊首元素查看該點是否等于E.......(重復做綠色部分的步驟,直到隊列為空)。為了便于理解,上面貼出了圖2和圖3。圖中的數字即為第n步到達的位置。

下面貼出源代碼:

?

1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 char map[17][17];//地圖 6 bool visit[17][17];//用來記錄狀態 7 int dir[][2]={{1,0},{0,1},{-1,0},{0,-1}};//方向 8 struct Point 9 { //記錄點的坐標和步數 10 int x,y,cnt; 11 }; 12 void BFS(int sx,int sy) 13 { 14 queue<Point> a; 15 Point now,next; 16 now.x = sx; now.y = sy; now.cnt = 0; 17 a.push(now); 18 visit[sx][sy] = 1; 19 while(!a.empty()) 20 { 21 Point temp = a.front(); a.pop(); 22 if(map[temp.x][temp.y] == 'E') 23 { 24 printf("%d\n",temp.cnt); 25 return ; 26 } 27 for(int i = 0; i < 4; i++) 28 { 29 next.x = temp.x+dir[i][0]; 30 next.y = temp.y+dir[i][1]; 31 next.cnt = temp.cnt+1; 32 if((!visit[next.x][next.y]) && (map[next.x][next.y]!='*')) 33 { a.push(next); visit[next.x][next.y] = 1;} 34 } 35 } 36 return ; 37 } 38 int main(void) 39 { 40 int i,j,t,m,n; 41 scanf("%d",&t); 42 while(t--) 43 { 44 int sx,sy; 45 memset(visit,0,sizeof(visit)); 46 scanf("%d",&n); 47 for(i = 1; i <= n; i++) 48 scanf("%s",&map[i][1]); 49 for(i = 0; i <= (n+1); i++) 50 for(j = 0; j <= (n+1); j++) 51 { 52 if(map[i][j] == 'S') 53 sx = i, sy = j; 54 if((i==0) || (j==0) || (i==n+1) || (j==n+1)) 55 map[i][j] = '*'; 56 } 57 BFS(sx,sy); 58 } 59 60 return 0; 61 } View Code

?

這是我做的第一道搜索題,做了一下午,才真正搞懂BFS。以前也一直不會BFS,看別人的代碼都好長,有的又看不懂。還是上面紅色鏈接里的PPT幫了大忙,不懂的多看幾次PPT。下面是我做的PPT也可以看看:http://files.cnblogs.com/files/Muia/%E8%BF%B7%E5%AE%AB.ppt

?

轉載于:https://www.cnblogs.com/Muia/p/5774317.html

總結

以上是生活随笔為你收集整理的广度优先搜索(BFS)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。