結果
| 問題 | No.3754 Mischievous Resident (Hard) |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-08-22 04:20:37 |
| 言語 | C++17 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
RE
不安定
|
| 実行時間 | - |
| コード長 | 2,118 bytes |
| 記録 | |
| コンパイル時間 | 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 |
ソースコード
#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';
}
}