結果
| 問題 | No.3804 Crossword Key Filler |
| ユーザー |
|
| 提出日時 | 2026-10-28 14:07:33 |
| 言語 | C++17 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 2 ms / 2,000 ms |
| + 312µs | |
| コード長 | 1,535 bytes |
| 記録 | |
| コンパイル時間 | 1,361 ms |
| コンパイル使用メモリ | 228,556 KB |
| 実行使用メモリ | 9,848 KB |
| 最終ジャッジ日時 | 2026-11-14 14:35:38 |
| 合計ジャッジ時間 | 4,034 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 50 |
ソースコード
#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> S(H);
for (int i = 0; i < H; i++) {
cin >> S[i];
}
// 横・縦のカギの開始位置を、共通の番号で管理する
vector<pair<int, int>> start(1, {-1, -1});
vector<int> dir(1, -1);
vector<vector<int>> horizontal(H, vector<int>(W, 0));
vector<vector<int>> vertical(H, vector<int>(W, 0));
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
if (S[i][j] != '.') continue;
bool across =
(j == 0 || S[i][j - 1] == '#') &&
(j + 1 < W && S[i][j + 1] == '.');
bool down =
(i == 0 || S[i - 1][j] == '#') &&
(i + 1 < H && S[i + 1][j] == '.');
if (across || down) {
int k = (int)start.size();
start.push_back({i, j});
if (across) horizontal[i][j] = k;
if (down) vertical[i][j] = k;
}
}
}
int Q;
cin >> Q;
while (Q--) {
int K, D;
string A;
cin >> K >> D >> A;
auto [i, j] = start[K];
for (char c : A) {
S[i][j] = c;
if (D == 0) {
j++;
} else {
i++;
}
}
for (int i = 0; i < H; i++) {
cout << S[i] << '\n';
}
}
return 0;
}