結果

問題 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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");
}
0