結果

問題 No.3504 Insert Maze
コンテスト
ユーザー Nattt
提出日時 2026-04-18 00:23:06
言語 C++17(gcc12)
(gcc 12.4.0 + boost 1.89.0)
コンパイル:
g++-12 -O2 -lm -std=c++17 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 458 ms / 2,000 ms
コード長 3,588 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,169 ms
コンパイル使用メモリ 80,152 KB
実行使用メモリ 132,480 KB
最終ジャッジ日時 2026-04-18 00:23:27
合計ジャッジ時間 20,085 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 85
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main() {
    // Optimasi Fast I/O agar secepat kilat
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int H, W;
    if (!(cin >> H >> W)) return 0;

    vector<string> grid(H);
    for (int i = 0; i < H; i++) {
        cin >> grid[i];
    }

    int R = 2 * H - 1;
    int C = 2 * W - 1;
    int N = R * C;

    // Fungsi untuk mengecek apakah sebuah koordinat expanded adalah dinding (#)
    auto is_wall = [&](int r, int c) {
        if (r % 2 == 0 && c % 2 == 0) {
            return grid[r / 2][c / 2] == '#';
        }
        return false; // Lorong sisipan selalu kosong
    };

    // Array flat untuk jarak (16 juta elemen, sekitar 64MB memori, sangat aman)
    vector<int> dist(N, -1);
    
    // Array Queue statis, ini jauh lebih cepat daripada std::queue
    vector<int> q;
    q.reserve(N);
    int head = 0;

    q.push_back(0);
    dist[0] = 0;

    int target = N - 1;
    if (target == 0) {
        cout << 0 << "\n";
        return 0;
    }

    while (head < q.size()) {
        int u = q[head++];
        if (u == target) {
            cout << dist[u] << "\n";
            return 0;
        }

        int r = u / C;
        int c = u % C;
        int d = dist[u];
        int nd = d + 1;

        // 1. Bergerak ke sel bersebelahan (Masuk/keluar lorong) - Cost 1
        if (c > 0) {
            int nr = r, nc = c - 1;
            if (!is_wall(nr, nc)) {
                int v = nr * C + nc;
                if (dist[v] == -1) { dist[v] = nd; q.push_back(v); }
            }
        }
        if (c < C - 1) {
            int nr = r, nc = c + 1;
            if (!is_wall(nr, nc)) {
                int v = nr * C + nc;
                if (dist[v] == -1) { dist[v] = nd; q.push_back(v); }
            }
        }
        if (r > 0) {
            int nr = r - 1, nc = c;
            if (!is_wall(nr, nc)) {
                int v = nr * C + nc;
                if (dist[v] == -1) { dist[v] = nd; q.push_back(v); }
            }
        }
        if (r < R - 1) {
            int nr = r + 1, nc = c;
            if (!is_wall(nr, nc)) {
                int v = nr * C + nc;
                if (dist[v] == -1) { dist[v] = nd; q.push_back(v); }
            }
        }

        // 2. Melompat melewati baris/kolom (Berjalan di lorong atau jalan normal) - Cost 1
        if (c % 2 == 0) { // Lompat horizontal
            if (c >= 2) {
                int nr = r, nc = c - 2;
                if (!is_wall(nr, nc)) {
                    int v = nr * C + nc;
                    if (dist[v] == -1) { dist[v] = nd; q.push_back(v); }
                }
            }
            if (c < C - 2) {
                int nr = r, nc = c + 2;
                if (!is_wall(nr, nc)) {
                    int v = nr * C + nc;
                    if (dist[v] == -1) { dist[v] = nd; q.push_back(v); }
                }
            }
        }

        if (r % 2 == 0) { // Lompat vertikal
            if (r >= 2) {
                int nr = r - 2, nc = c;
                if (!is_wall(nr, nc)) {
                    int v = nr * C + nc;
                    if (dist[v] == -1) { dist[v] = nd; q.push_back(v); }
                }
            }
            if (r < R - 2) {
                int nr = r + 2, nc = c;
                if (!is_wall(nr, nc)) {
                    int v = nr * C + nc;
                    if (dist[v] == -1) { dist[v] = nd; q.push_back(v); }
                }
            }
        }
    }

    // Jika tidak ada jalan sama sekali
    cout << -1 << "\n";
    return 0;
}
0