1. 程式人生 > 其它 >搜尋與圖論②--寬度優先搜尋(BFS)

搜尋與圖論②--寬度優先搜尋(BFS)

寬度優先搜尋

例題一(獻給阿爾吉儂的花束)

阿爾吉儂是一隻聰明又慵懶的小白鼠,它最擅長的就是走各種各樣的迷宮。

今天它要挑戰一個非常大的迷宮,研究員們為了鼓勵阿爾吉儂儘快到達終點,就在終點放了一塊阿爾吉儂最喜歡的乳酪。

現在研究員們想知道,如果阿爾吉儂足夠聰明,它最少需要多少時間就能吃到乳酪。

迷宮用一個 R×C 的字元矩陣來表示。

字元 S 表示阿爾吉儂所在的位置,字元 E 表示乳酪所在的位置,字元 # 表示牆壁,字元 . 表示可以通行。

阿爾吉儂在 1 個單位時間內可以從當前的位置走到它上下左右四個方向上的任意一個位置,但不能走出地圖邊界。

輸入格式
第一行是一個正整數 T,表示一共有 T 組資料。

每一組資料的第一行包含了兩個用空格分開的正整數 R 和 C,表示地圖是一個 R×C 的矩陣。

接下來的 R 行描述了地圖的具體內容,每一行包含了 C 個字元。字元含義如題目描述中所述。保證有且僅有一個 S 和 E。

輸出格式
對於每一組資料,輸出阿爾吉儂吃到乳酪的最少單位時間。

若阿爾吉儂無法吃到乳酪,則輸出“oop!”(只輸出引號裡面的內容,不輸出引號)。

每組資料的輸出結果佔一行。

資料範圍
1<T≤10,
2≤R,C≤200
輸入樣例:
3
3 4
.S..
###.
..E.
3 4
.S..
.E..
....
3 4
.S..
####
..E.
輸出樣例:
5
1
oop!

題解

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N=210;
char g[N][N];
int dis[N][N];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int n,m;
int T;
int bfs(PII start){
    queue<PII> q;
    memset(dis,-1,sizeof dis);
    dis[start.x][start.y]=0;
    q.push(start);
    while(!q.empty()){
        PII t=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int a=t.x+dx[i],b=t.y+dy[i];
            if(a>=n||a<0||b>=m||b<0)continue;
            if(g[a][b]=='#')continue;
            if(dis[a][b]!=-1)continue;
            
            if(g[a][b]=='E')return dis[t.x][t.y]+1;
            
            q.push({a,b});
            dis[a][b]=dis[t.x][t.y]+1;
        }
    }
    return -1;
}
int main(){
    cin>>T;
    while(T--){
        cin>>n>>m;
        PII start;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                cin>>g[i][j];
                if(g[i][j]=='S'){
                    start={i,j};
                }
            }
        }
        // cout<<start.x<<start.y<<endl;
        int distence=bfs(start);
        if(distence==-1){
            cout<<"oop!"<<endl;
        }else{
            cout<<distence<<endl;
        }
    }
    
    return 0;
}