BOJ 6593商業ビル


6方向に沿ってBFSを実行し、距離を求めればよい.座標はtuple STLで実現される.

私は1時間考えましたが、間違った原因は出力時の最後です.撮ってくれなかったので、ずっと間違えていました.別の場所でかき集める.ううう
#include <bits/stdc++.h>
using namespace std;
int L, R, C;
string building[31][31];
int dist[31][31][31];
int dx[6] = {-1, 1, 0, 0, 0, 0};
int dy[6] = {0, 0, -1, 1, 0, 0};
int dz[6] = {0, 0, 0, 0, -1, 1};
int main() {
    cout.sync_with_stdio(0);
    cin.tie(0);
    while(true){
        bool flag = false;
        cin >> L >> R >> C;
        if(L == 0 && R == 0 && C == 0) break;

        //initialize dist to -1
        for(int i = 0; i < L; i++){
            for(int j = 0; j < R; j++) {
                fill(dist[i][j], dist[i][j] + C, -1);
            }
        }

        queue<tuple<int, int, int>> Q;
        tuple<int, int, int> End;

        for(int i = 0; i < L; i++) {
            for(int j = 0; j < R; j++) {
                cin >> building[i][j];
                string input = building[i][j];
                for(int k = 0; k < C; k++) {
                    if(input[k] == 'S') {
                        Q.push(make_tuple(i, j, k));
                        dist[i][j][k] = 0;
                    }
                    if(input[k] == 'E') {
                        End = make_tuple(i, j, k);
                    }
                }
            }
        }
        while(!Q.empty()) {
            if(flag) break;
            auto cur = Q.front(); Q.pop();
            int curX, curY, curZ;
            tie(curZ, curX, curY) = cur;
            for(int i = 0; i < 6; i++) {
                int nz = curZ + dz[i];
                int ny = curY + dy[i];
                int nx = curX + dx[i];
                if(nz < 0 || nz >= L || nx < 0 || nx >= R || ny < 0 || ny >= C) continue;
                if(dist[nz][nx][ny] != -1) continue;
                if(building[nz][nx][ny] == '#') continue;
                Q.push(make_tuple(nz, nx, ny));
                dist[nz][nx][ny] = dist[curZ][curX][curY] + 1;
                if(building[nz][nx][ny] == 'E') {
                    flag = true;
                    cout << "Escaped in " << dist[nz][nx][ny] << " minute(s)." << '\n';
                    break;
                }
            }
        }
        if(!flag){
            cout << "Trapped!" << '\n';
        }
    }
    return 0;
}
今度は印刷されたものをよく見ます.無実だ