题目链接: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;
}