結果
| 問題 | No.3504 Insert Maze |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-18 05:44:20 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 39 ms / 2,000 ms |
| コード長 | 2,077 bytes |
| 記録 | |
| コンパイル時間 | 2,280 ms |
| コンパイル使用メモリ | 336,824 KB |
| 実行使用メモリ | 7,968 KB |
| 最終ジャッジ日時 | 2026-04-18 05:44:28 |
| 合計ジャッジ時間 | 7,371 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 85 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int h, w;
cin >> h >> w;
vector<string> g(h);
for (int i = 0; i < h; i++) cin >> g[i];
const long long INF = (long long)4e18;
vector<long long> upA(w, INF), upB(max(0, w - 1), INF), upC(w, INF), upD(max(0, w - 1), INF);
for (int r = 0; r < h; r++) {
vector<long long> a(w, INF), b(max(0, w - 1), 0), c(w, 0), d(max(0, w - 1), 0);
long long leftA = INF, leftB = INF, leftC = INF, leftD = INF;
bool down = (r + 1 < h);
bool top = (r > 0);
bool first = (r == 0);
for (int j = 0; j < w; j++) {
long long cur = (first && j == 0 ? 0 : INF);
if (g[r][j] != '#') {
if (upA[j] < cur) cur = upA[j];
if (upC[j] < cur) cur = upC[j];
if (leftA < cur) cur = leftA;
if (leftB < cur) cur = leftB;
}
a[j] = cur;
long long x = 0, y = 0;
if (j + 1 < w) {
x = cur + 1;
if (top) {
if (upB[j] < x) x = upB[j];
if (upD[j] < x) x = upD[j];
}
b[j] = x;
}
if (down) {
y = cur + 1;
if (j) {
if (leftC < y) y = leftC;
if (leftD < y) y = leftD;
}
c[j] = y;
}
if (down && j + 1 < w) {
long long z = x;
if (y < z) z = y;
d[j] = z + 1;
}
leftA = cur;
if (j + 1 < w) leftB = b[j];
if (down) {
leftC = c[j];
if (j + 1 < w) leftD = d[j];
}
}
upA.swap(a);
upB.swap(b);
upC.swap(c);
upD.swap(d);
}
long long res = upA[w - 1];
if (res >= INF / 2) cout << -1 << '\n';
else cout << res + h + w - 2 << '\n';
return 0;
}