結果

問題 No.3754 Mischievous Resident (Hard)
コンテスト
ユーザー marc2825
提出日時 2026-08-22 04:20:37
言語 C++17
(gcc 15.3.0 + boost 1.92.0 + ACL)
コンパイル:
g++-15 -O2 -lm -std=c++17 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
RE  
実行時間 -
コード長 2,118 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,209 ms
コンパイル使用メモリ 220,964 KB
実行使用メモリ 1,307,140 KB
最終ジャッジ日時 2026-10-02 21:04:56
合計ジャッジ時間 5,566 ms
ジャッジサーバーID
(参考情報)
judge2_1 / judge4_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other RE * 1 MLE * 2 -- * 45
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;

using ll = long long;

// N^M が小さい場合専用の完全愚直
// 到達不能なら -1
int brute(int N, const vector<int>& S, const vector<int>& G) {
    int M = S.size();

    // state = sum (pos[i]-1) * N^i
    auto encode = [&](const vector<int>& a) {
        int id = 0;
        int p = 1;
        for (int i = 0; i < M; i++) {
            id += (a[i] - 1) * p;
            p *= N;
        }
        return id;
    };

    auto decode = [&](int id) {
        vector<int> a(M);
        for (int i = 0; i < M; i++) {
            a[i] = id % N + 1;
            id /= N;
        }
        return a;
    };

    int states = 1;
    for (int i = 0; i < M; i++) states *= N;

    int s = encode(S);
    int g = encode(G);

    vector<int> dist(states, -1);
    queue<int> q;

    dist[s] = 0;
    q.push(s);

    while (!q.empty()) {
        int id = q.front();
        q.pop();

        if (id == g) return dist[id];

        vector<int> x = decode(id);

        // F 階の呼び出しボタンを押す
        for (int F = 1; F <= N; F++) {
            int mn = INT_MAX;

            for (int i = 0; i < M; i++) {
                mn = min(mn, abs(x[i] - F));
            }

            // 最短距離で並んでいる elevator はどれでも選べる
            for (int i = 0; i < M; i++) {
                if (abs(x[i] - F) != mn) continue;

                // 既に F にいるなら押しても状態は変わらない
                if (x[i] == F) continue;

                vector<int> y = x;
                y[i] = F;

                int nid = encode(y);

                if (dist[nid] == -1) {
                    dist[nid] = dist[id] + 1;
                    q.push(nid);
                }
            }
        }
    }

    return -1;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int Q;
    cin >> Q;

    while (Q--) {
        int N, M;
        cin >> N >> M;

        vector<int> S(M), G(M);
        for (auto& x : S) cin >> x;
        for (auto& x : G) cin >> x;

        cout << brute(N, S, G) << '\n';
    }
}
0