题目链接:https://ac.nowcoder.com/acm/contest/322/B
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
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"(不包括双引号)
输入
4 3
+-+-+-+
|S| | |
+ +-+-+
| | | |
+ +-+-+
| |T |
+ +-+ +
| |
+-+-+-+
3 3
+-+-+-+
|S| |
+ + +-+
| | |T|
+ + +-+
| | |
+-+-+-+
输出
8
TRDD Got lost...TAT
说明
样例1:TRDD所在的位置为(1, 1), 机场的位置为(3, 2).
路线为(1, 1) -> (2, 1) -> (3, 1) -> (4, 1) -> (4,2) -> (4,3) -> (3,3) ->(3,2).
共8个格子.
样例2:无法从S到达T.
备注:
由于数据量过大,建议不要使用scanf("%c")读入,否则可能会TLE。
如果输入样例显示格式有误, 请参考图片:
解题思路
BFS跑一遍。。。
#include <queue>
#include <iostream>
using namespace std;
char map[6005][6005];
int vis[6005][6005];
struct node {
int x, y, step;
};
int d[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1 , 0}};
int main()
{
int n, m;
node a, now, next;
scanf("%d%d%*c", &n, &m);
for (int i = 0; i < 2 * n + 1; i++)
gets(map[i]);
for (int i = 0; i < (2 * n + 1); i++)
for (int j = 0; j < (2 * m + 1); j++)
if (map[i][j] == 'S')
a.x = i, a.y = j;
a.step = 1;
queue <node> Q;
Q.push(a);
while (!Q.empty())
{
now = Q.front();
Q.pop();
if (map[now.x][now.y] == 'T')
{
cout << now.step << endl;
return 0;
}
for (int i = 0; i < 4; i++)
{
next.x = now.x + d[i][0];
next.y = now.y + d[i][1];
if (next.x >= 0 && next.x < 2 * n + 1 && next.y >= 0 && next.y < 2 * m + 1 && (map[next.x][next.y] != '|' && map[next.x][next.y] != '-'))
{
next.x = next.x + d[i][0];
next.y = next.y + d[i][1];
if (next.x >= 0 && next.x < 2 * n + 1 && next.y >= 0 && next.y < 2 * m + 1 &&!vis[next.x][next.y])
{
next.step = now.step + 1;
vis[next.x][next.y] = 1;
Q.push(next);
}
}
}
}
cout << "TRDD Got lost...TAT" << endl;
return 0;
}