結果
| 問題 | No.3504 Insert Maze |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-18 04:39:15 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 78 ms / 2,000 ms |
| コード長 | 2,420 bytes |
| 記録 | |
| コンパイル時間 | 2,588 ms |
| コンパイル使用メモリ | 337,216 KB |
| 実行使用メモリ | 15,616 KB |
| 最終ジャッジ日時 | 2026-04-18 04:39:33 |
| 合計ジャッジ時間 | 7,774 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge3_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> C(H);
for (int i = 0; i < H; i++) cin >> C[i];
auto id = [&](int i, int j) { return i * W + j; };
vector<unsigned char> fromS(H * W, 0), toG(H * W, 0);
// fromS
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
if (C[i][j] == '#') continue;
if (i == 0 && j == 0) {
fromS[id(i, j)] = 1;
} else {
bool ok = false;
if (i > 0 && fromS[id(i - 1, j)]) ok = true;
if (j > 0 && fromS[id(i, j - 1)]) ok = true;
fromS[id(i, j)] = ok;
}
}
}
// toG
for (int i = H - 1; i >= 0; i--) {
for (int j = W - 1; j >= 0; j--) {
if (C[i][j] == '#') continue;
if (i == H - 1 && j == W - 1) {
toG[id(i, j)] = 1;
} else {
bool ok = false;
if (i + 1 < H && toG[id(i + 1, j)]) ok = true;
if (j + 1 < W && toG[id(i, j + 1)]) ok = true;
toG[id(i, j)] = ok;
}
}
}
// 0回使用で最短 H+W-2
if (fromS[id(H - 1, W - 1)]) {
cout << H + W - 2 << '\n';
return 0;
}
// 1行挿入で H+W-1 を作れるか
for (int r = 0; r + 1 < H; r++) {
vector<unsigned char> suff(W + 1, 0);
for (int j = W - 1; j >= 0; j--) {
suff[j] = suff[j + 1] || toG[id(r + 1, j)];
}
bool pref = false;
for (int j = 0; j < W; j++) {
pref = pref || fromS[id(r, j)];
if (pref && suff[j]) {
cout << H + W - 1 << '\n';
return 0;
}
}
}
// 1列挿入で H+W-1 を作れるか
for (int c = 0; c + 1 < W; c++) {
vector<unsigned char> suff(H + 1, 0);
for (int i = H - 1; i >= 0; i--) {
suff[i] = suff[i + 1] || toG[id(i, c + 1)];
}
bool pref = false;
for (int i = 0; i < H; i++) {
pref = pref || fromS[id(i, c)];
if (pref && suff[i]) {
cout << H + W - 1 << '\n';
return 0;
}
}
}
// それ以外は 2回使えば必ず H+W
cout << H + W << '\n';
return 0;
}