BFS——献给阿尔吉侬的花束

 

 输入样例:

3
3 4
.S..
###.
..E.
3 4
.S..
.E..
....
3 4
.S..
####
..E.

我的题解:

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
int n,m;
char s[220][220];
int dis[220][220];
typedef pair<int,int> PII;
int dx[]={1,0,0,-1};
int dy[]={0,-1,1,0};

int bfs(PII start,PII end)
{
    queue<PII> q;
    q.push(start);
    memset(dis,-1,sizeof dis);
    dis[start.x][start.y]=0;

    while(q.size())
    {
        PII t = q.front();
        q.pop();

        for(int i=0;i<4;i++)
        {
            int x = t.x+dx[i], y = t.y +dy[i];
            if(x<0||x>=n||y<0||y>=m) continue;//出界
            if(s[x][y]=='#') continue;//障碍物
            if(dis[x][y]!=-1) continue;//已经遍历过了

            dis[x][y]=dis[t.x][t.y]+1;
            if(end == make_pair(x,y)) return dis[x][y];
            q.push({x,y});
        }
    }
    return -1;
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++) scanf("%s",s[i]);

        PII start ,end;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(s[i][j]=='E') end={i,j};
                else if (s[i][j]=='S') start ={i,j};
            }
        }
        int res = bfs(start ,end);
        if(res ==-1) printf("oop!\n");
        else printf("%d\n",res);
    }
}

 

标准题解:

 

posted @ 2023-04-07 22:29  小花护符  阅读(24)  评论(0编辑  收藏  举报