NC201613 Jelly

题目链接

题目

题目描述

Nancy喜欢吃果冻!

Nancy钻进了一个 \(n \times n \times n\) 的果冻里,她想从(1,1,1)一路上、下、左、右、前、后六个方向吃到(n,n,n)。

但果冻毕竟是有许多口味的,标记为*的口味是Nancy不愿意吃的,其余的果冻均标记为.。

Nancy不想吃坏肚子,于是她想尽可能少的吃果冻。
下面给出果冻的情况,请你帮忙计算一下她能吃多少块果冻叭!

输入描述

第一行:一个整数n。
接下来n层,每组n行,每行n列,表示果冻(i,j,k)的情况(如题目描述所述)。
数据满足:\(1 \leq n \leq 100\),保证果冻(1,1,1)不是Nancy不愿意吃的。

输出描述

如果可以到达(n,n,n),请输出路上吃的果冻数量,否则请输出-1。

示例1

输入

2
.*
..
*.
..

输出

4

题解

知识点:BFS。

一个三维迷宫板板题,没啥好说的,第一次写觉得挺好玩qwq。

代码

#include <bits/stdc++.h>

using namespace std;

int n;
char dt[110][110][110];
int step[110][110][110];
int dir[6][3] = { {-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1} };
struct pos {
    int x, y, z;
};

int bfs() {
    queue<pos> q;
    pos s = { 0,0,0 };
    step[0][0][0] = 1;
    q.push(s);
    while (!q.empty()) {
        pos now_pos = q.front();
        q.pop();
        if (now_pos.x == n - 1 && now_pos.y == n - 1 && now_pos.z == n - 1)
            return step[n - 1][n - 1][n - 1];
        for (int i = 0;i < 6;i++) {
            pos cur_pos;
            cur_pos.x = now_pos.x + dir[i][0];
            cur_pos.y = now_pos.y + dir[i][1];
            cur_pos.z = now_pos.z + dir[i][2];
            if (0 <= cur_pos.x && cur_pos.x < n &&
                0 <= cur_pos.y && cur_pos.y < n &&
                0 <= cur_pos.z && cur_pos.z < n &&
                dt[cur_pos.x][cur_pos.y][cur_pos.z] == '.' &&
                !step[cur_pos.x][cur_pos.y][cur_pos.z]) {
                q.push(cur_pos);
                step[cur_pos.x][cur_pos.y][cur_pos.z] = step[now_pos.x][now_pos.y][now_pos.z] + 1;
            }
        }
    }
    return -1;
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            cin >> dt[i][j];
    cout << bfs() << '\n';
    return 0;
}
posted @ 2022-07-16 16:23  空白菌  阅读(34)  评论(0编辑  收藏  举报