列表

详情


NC21821. TRDD got lost again

描述

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 504ms, 内存消耗: 37904K, 提交时间: 2019-01-28 14:26:16

#include<iostream>
#include<queue>
using namespace std;
const int L=6500;
char mp[L][L];
int n,m;
struct node{
	int x,y,s;
};
int main(){
	int next[2][4]={1,0,-1,0,0,1,0,-1};
	queue<node>q;
	cin>>n>>m;
	n=2*n+1;m=2*m+1;
	getchar();
	for(int i=0;i<n;i++){
		getchar();//接受每次每行的换行字符; 
		for(int j=0;j<m;j++){
			mp[i][j]=getchar();
		}
	}
	int stx,sty,flag=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(mp[i][j]=='S'){
				stx=i;sty=j;
			}
			if(mp[i][j]!='S'&&mp[i][j]!='T'&&mp[i][j]!=' ')mp[i][j]='#';
		}
	}
	q.push(node{stx,sty,1}); 
	while(!q.empty()){
		node h=q.front();q.pop();
		for(int i=0;i<4;i++){
			int tx=h.x+next[0][i];
			int ty=h.y+next[1][i];
			if(mp[tx][ty]=='#'||tx<0||ty<0||tx>=n||ty>=m)continue;
			mp[tx][ty]='#';
			tx+=next[0][i];
			ty+=next[1][i];
			q.push(node{tx,ty,h.s+1});
		    if(mp[tx][ty]=='T'){
		    	cout<<h.s+1<<endl;
		    	return 0;
			}
		}
	}
	cout<<"TRDD Got lost...TAT"<<endl;
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 554ms, 内存消耗: 46456K, 提交时间: 2020-02-27 13:37:03

#include<bits/stdc++.h>
using namespace std;
int d[4][2]={1,0,0,1,-1,0,0,-1};
string mp[6005];
bool vis[6005][6005];
int n,m;
struct edge
{
	int x,y;
	int d;
};
queue<edge>q;
int main()
{
	ios_base::sync_with_stdio(0);
	cin>>n>>m;
	n=n*2+1;
	m=m*2+1;
	int sx,sy;
	getchar();
	for(int i=0;i<n;i++)
	{
		getline(cin,mp[i]);
		for(int j=0;j<m;j++)
		if(mp[i][j]=='S') sx=i,sy=j;
	}
	int ans=-1;
	q.push(edge{sx,sy,1});
	vis[sx][sy]=1;
	while(q.size())
	{
		edge u=q.front();
		q.pop();
		for(int k=0;k<4;k++)
		{
			int x=u.x+d[k][0];
			int y=u.y+d[k][1];
			if(mp[x][y]!=' '&&mp[x][y]!='T') continue;
			if(vis[x][y]) continue;
			if(mp[x][y]=='T') ans=u.d+1;
			q.push(edge{x,y,u.d+1});
			vis[x][y]=1;
		}
		if(ans!=-1) break;
	}
	if(ans!=-1) cout<<ans/2+1<<endl;
	else cout<<"TRDD Got lost...TAT"<<endl;
}

上一题