题解:B4214 [常州市程序设计小能手 2022] 迷宫探险

· · 题解

有一句话叫暴力出奇迹,我来分享一下我的暴力搜索做法。

实现过程

代码细节

AC Code:

#include <bits/stdc++.h>
const int MAXN = 200;
using namespace std;
char mp[MAXN][MAXN];

struct Pos {
    int id, x, y;
};

const int dx[4] = {1, -1, 0, 0};

const int dy[4] = {0, 0, -1, 1};
int dist[20][MAXN][MAXN], res[20], num, n, vis[MAXN][MAXN];

void bfs() {
    queue<Pos> que;

    // 遍历地图,找到所有起点(标记为 '@' 的点)
    for (int i = 1; i <= n; i++) {

        for (int j = 1; j <= n; j++) {

            if (mp[i][j] == '@') {
                num++;
                que.push({num, i, j});
                dist[num][i][j] = 1;
            }
        }
    }

    while (!que.empty()) {
        Pos cur = que.front();
        que.pop();
        int k = cur.id, x = cur.x, y = cur.y;

        // 遍历四个方向
        for (int i = 0; i < 4; i++) {

            int nx = x + dx[i];
            int ny = y + dy[i];

            if (nx >= 1 && nx <= n && ny >= 1 && ny <= n && !dist[k][nx][ny] && mp[nx][ny] != '#') {
                dist[k][nx][ny] = dist[k][x][y] + 1;
                que.push({k, nx, ny});

                if (mp[nx][ny] == '$') {
                    if (vis[nx][ny] == 0 || vis[nx][ny] == dist[k][nx][ny]) {
                        // 标记该目标点已被访问
                        vis[nx][ny] = dist[k][nx][ny];
                        res[k]++;
                    }
                }
            }
        }
    }
}

signed main() {
    cin >> n;

    for (int i = 1; i <= n; i++) {

        for (int j = 1; j <= n; j++) {

            cin >> mp[i][j];
        }
    }

    bfs();
    int maxRes = 0, sumRes = 0;

    // 遍历所有起点,更新最大值和总数
    for (int i = 1; i <= num; i++) {

        maxRes = max(maxRes, res[i]);
        sumRes += res[i];
    }

    cout << maxRes << "\n" << sumRes << "\n";

    return 0;
}

本蒟蒻第一次写题解,点个赞再走吧