結果
問題 |
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"); }