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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BFS(入门题--迷宫)

發布時間:2024/9/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BFS(入门题--迷宫) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

//這題之前用DFS寫過,現在再用它來寫BFS
1185: 走迷宮
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 435 Solved: 168
[Submit][Status][Web Board]
Description

給一張個迷宮,問能否從起點走到終點,只能往上下左右走,不能斜著走

Input

多組測試數據,每組第一行兩個正整數,分別為n和m

表示n這個迷宮有n行m列(0<n,m<10)

接著是n行m列,

'#'表示路

‘*’表示墻

‘S’表示起點

‘T’表示終點

Output

每組測試數據輸出一個結果,如果能從S走到T,輸出“YES”,否則輸出“NO”

Sample Input

2 2
S*
#T
3 3
S*#
#T
##

Sample Output

YES
NO

HINT

Source
/*
BFS,廣度優先搜索,類似于樹的層序遍歷。
所以,寫BFS的關鍵在于確定每一層的元素。

首先要確定起點,然后拿出起點來看一下是否為終點,如果是,則結束搜索。
如果不是,就以此點為擴展,擴展出與它相連的點并且沒有看過的點作為下一層的元素。。

每層的元素都可以擴展0個到多個元素作為下一層元素。然后一層一層一個一個拿出來看是不是終點。
從上述可以看出,先進先出,可以維護一個隊列。每次拿出一個元素來看是不是終點,不是的話就把它可以擴展出來的并且沒有訪問過的下一層元素加入到隊列中~,直到拿出來的是終點或者隊列已空
/
Ac_code:
/
本題應該注意:不能用%c一個一個字符讀入然后沒讀一行加getchar(),這樣寫提交會過不了,應該盡量避免使用getchar(),這里使用%s一行一行讀入就能AC
*/

#include <bits/stdc++.h> using namespace std; char a[15][15]; int vis[15][15]; int n,m; struct date {int x;int y; }; date s,p; queue<date>q; int step_x[]= {-1,1,0,0},step_y[] = {0,0,-1,1}; int BFS() {while(!q.empty()){p = q.front();vis[p.x][p.y] = 1;q.pop();if(a[p.x][p.y] == 'T')return 1;else{for(int i = 0; i < 4; i++){s.x = p.x + step_x[i];s.y = p.y + step_y[i];if(s.x>=0&&s.x<n&&s.y>=0&&s.y<m&&!vis[s.x][s.y]&&a[s.x][s.y]!='*'){q.push(s);}}}}return 0; } int main() {while(~scanf("%d%d",&n,&m)){while(!q.empty()){q.pop();}for(int i = 0; i < n; i++){scanf("%s",a[i]);for(int j = 0; j < m; j++){vis[i][j] = 0;if(a[i][j] == 'S'){s.x = i;s.y = j;q.push(s);}}}if(BFS())printf("YES\n");elseprintf("NO\n");}return 0; }

總結

以上是生活随笔為你收集整理的BFS(入门题--迷宫)的全部內容,希望文章能夠幫你解決所遇到的問題。

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