题目描述
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|
+ + +-+
| | |
+-+-+-+
输出
复制
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);
}