結果
| 問題 |
No.86 TVザッピング(2)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-05-10 17:13:22 |
| 言語 | D (dmd 2.109.1) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 5,000 ms |
| コード長 | 1,294 bytes |
| コンパイル時間 | 3,319 ms |
| コンパイル使用メモリ | 198,520 KB |
| 実行使用メモリ | 7,844 KB |
| 最終ジャッジ日時 | 2025-06-20 13:56:08 |
| 合計ジャッジ時間 | 4,254 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 |
ソースコード
module main;
// https://yang33-kassa.jp/yukicoder/yukicoder086/ より
import std;
void main()
{
// 入力
int N, M;
readln.chomp.formattedRead("%d %d", N, M);
char[][] A;
foreach (_; 0 .. N)
A ~= readln.chomp.dup;
// 答えの計算と出力
alias P = Tuple!(int, "x", int, "y");
immutable INF = 10 ^^ 9;
P S = P(INF, INF);
foreach (i; 0 .. N)
foreach (j; 0 .. M)
if (A[i][j] == '.') S = min(S, P(i, j));
// 座標が盤面内に収まっている空きマスかどうか
alias isValid = p => (0 <= p.x && p.x < N && 0 <= p.y && p.y < M && A[p.x][p.y] == '.');
auto dir = [P(1, 0), P(0, -1), P(-1, 0), P(0, 1)];
P cur = S;
// 左に曲がった回数と右に曲がった回数
int cntL = 0, cntR = 0;
int d = 0;
while (true) {
while (isValid(P(cur.x + dir[d].x, cur.y + dir[d].y))) {
cur.x += dir[d].x;
cur.y += dir[d].y;
A[cur.x][cur.y] = '#';
}
int ld = (d + 3) % 4, rd = (d + 1) % 4;
if (isValid(P(cur.x + dir[rd].x, cur.y + dir[rd].y))) {
// 右に曲がる
d = rd;
cntR++;
} else if (isValid(P(cur.x + dir[ld].x, cur.y + dir[ld].y))) {
// 左に曲がる
d = ld;
cntL++;
} else
break;
}
int dat = 0;
foreach (line; A)
dat += line.count('.');
if (cntR <= 1 && dat == 0)
writeln("YES");
else
writeln("NO");
}