西南民族大学第十届校赛(同步赛) - B题 - bfs

题目描述

X城市是一个交通十分不便利的城市,城市可以看成一个n * m大小的矩阵, 现在TRDD手里有该城市的地图:一个2*n+1行, 2 *m+1列大小的地图。现在TRDD所在的格子用S表示,机场所在的格子用T表示。 其他格子用空格表示,地图上左右相邻的两个格子如果不能通行用"|"表示, 上下相邻的两个点如果不能通行用"-"表示,”+“表示格子的四个角。 题目保证城市X最外圈无法通行(具体请看样例输入)。

为了能尽快赶到机场,TRDD想请你帮忙计算出他到达机场最少需要走过多少个格子(包括起点S和终点T)。

如果无法到达机场T,则输出"TRDD Got lost...TAT"(不包括双引号)。

输入描述:

第一行读入两个数n, m(1 <= n, m <= 3000)表示X城市的大小。

之后有2 * n + 1行, 每行有2 * m + 1个字符, 用来表示TRDD手里的地图

题目保证S和T都有且仅有一个。

输出描述:

如果TRDD能到达机场, 则输出TRDD最少需要经过几个格子
否则输出"TRDD Got lost...TAT"(不包括双引号)

示例1

输入

复制

4 3
+-+-+-+
|S| | |
+ +-+-+
| | | |
+ +-+-+
| |T  |
+ +-+ +
|     |
+-+-+-+

输出

复制

8

说明

TRDD所在的位置为(1, 1), 机场的位置为(3, 2)
路线为(1, 1) -> (2, 1) -> (3, 1) -> (4, 1) -> (4,2) -> (4,3) -> (3,3) ->(3,2)
共8个格子

示例2

输入

复制

3 3
+-+-+-+
|S|   |
+ + +-+
| | |T|
+ + +-+
|   | |
+-+-+-+

输出

复制

扫描二维码关注公众号,回复: 4719751 查看本文章
TRDD Got lost...TAT

说明

无法从S到达T

思路:

这个题有两个坑点:

1、我用d[i][j]数组存到每一个点,会内存超限qwq,用bool型的vis数组来标记访问没有就ok了

2、注意算出的距离是包括经过墙壁的,所以最后的ans=ans/2+1(加1是因为S和T点都算进去)

代码如下:

#include<iostream>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#include<stack>
#include<sstream>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
 
const int N1=6005,INF=0x3f3f3f3f;
char mape[N1][N1];
ll d[N1][N1];
int N,M,sx,sy,tx,ty;
struct A{
    int x,y,step;
}s,t,tmp;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
bool vis[N1][N1];
 
int bfs(){
    memset(vis,0,sizeof(vis));
    queue<A> que;
    s.step=0;
    que.push(s);
    vis[s.x][s.y]=1;
    while(que.size()){
        A p=que.front();que.pop();
        if(p.x==t.x&&p.y==t.y){return p.step;}
        for(int i=0;i<4;i++){
            int nx=p.x+dx[i],ny=p.y+dy[i];
            if((mape[nx][ny]==' '||mape[nx][ny]=='T')&&nx>=1&&nx<=N&&ny>=1&&ny<=M&&vis[nx][ny]==0){
                vis[nx][ny]=1;
                tmp.x=nx;tmp.y=ny;
                tmp.step=p.step+1;
                que.push(tmp);
            }
        }
    }
    return -1;
}
 
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    getchar();
    char ch;
    N=2*n+1;M=2*m+1;
    for(int i=1;i<=N;i++){
        for(int j=1;j<=M;j++){
            ch=getchar();
            mape[i][j]=ch;
            if(mape[i][j]=='S'){s.x=i;s.y=j;}
            if(mape[i][j]=='T'){t.x=i;t.y=j;}
        }
        ch=getchar();
    }
    int ans=bfs();
    if(ans==-1)printf("TRDD Got lost...TAT\n");
    else printf("%d\n",ans/2+1);
}

猜你喜欢

转载自blog.csdn.net/m0_37579232/article/details/85450373
今日推荐