题目链接:https://ac.nowcoder.com/acm/contest/940/D/
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口。kotori只能上下左右四个方向移动。她想知道有多少出口是她能到达的,最近的出口离她有多远?

输入描述

第一行为两个整数n和m,代表迷宫的行和列数 (1≤n,m≤30)
后面紧跟着n行长度为m的字符串来描述迷宫。'k'代表kotori开始的位置,'.'代表道路,'*'代表墙壁,'e'代表出口。保证输入合法。

输出描述

若有出口可以抵达,则输出2个整数,第一个代表kotori可选择的出口的数量,第二个代表kotori到最近的出口的步数。(注意,kotori到达出口一定会离开迷宫)
若没有出口可以抵达,则输出-1。

输入

6 8
e.*.*e.*
.**.*.*e
..*k**..
***.*.e*
.**.*.**
*......e

输出

2 7

说明

可供选择坐标为[4,7]和[6,8],到kotori的距离分别是8和7步。

解题思路

题意:问能到达的出口数量和最近的出口距离。
思路:BFS。

Accepted Code:

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
struct edge {
    int x, y, t;
}p;
char mp[35][35];
int n, m, cnt = 0, min_ = inf, vis[35][35];
int arr[4][2] = {{1, 0}, {0, 1}, {0, -1}, {-1, 0}}; 
void BFS(int x, int y) {
    int tx, ty;
    queue <edge> Q;
    Q.push((edge){x, y});
    while (!Q.empty()) {
        p = Q.front();
        Q.pop();
        if (mp[p.x][p.y] == 'e') {
            cnt++;
            min_ = min(min_, p.t);
            continue;
        }
        for (int i = 0; i < 4; i++) {
            tx = p.x + arr[i][0];
            ty = p.y + arr[i][1];
            if (tx >= 0 && tx < n && ty >= 0 && ty < m && !vis[tx][ty] && mp[tx][ty] != '*'){
                vis[tx][ty] = true;
                Q.push((edge){tx, ty, p.t + 1});
            }
        }
    }
}
int main() {
    int ex, ey;
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf(" %c", &mp[i][j]);
            if (mp[i][j] == 'k')
                ex = i, ey = j;
        }
    }
    BFS(ex, ey);
    if (min_ < inf)
        printf("%d %d\n", cnt, min_);
    else printf("-1\n");
    return 0;
}