結果
| 問題 |
No.86 TVザッピング(2)
|
| コンテスト | |
| ユーザー |
koyopro
|
| 提出日時 | 2015-10-01 18:22:39 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,434 bytes |
| コンパイル時間 | 1,261 ms |
| コンパイル使用メモリ | 161,916 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2025-06-20 13:59:20 |
| 合計ジャッジ時間 | 4,982 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | RE * 3 |
| other | AC * 8 RE * 22 |
ソースコード
#include "bits/stdc++.h"
using namespace std;
#define REP(i, n) for(int i=0; i<(n); i++)
int N,M;
string b[1111];
struct pos { int x, y; pos(int _x, int _y) { x = _x; y = _y; } };
int dxy[] = {0, 1, 0, -1, 0};
int total = 0; // 押せるボタンの数
bool isok(int y, int x) {
vector<pos> afs;
REP(i,4) {
int nx = x + dxy[i];
int ny = y + dxy[i+1];
if (nx<0||M<=nx||ny<0||N<=ny) continue;
afs.push_back(pos(nx,ny));
}
for (pos a : afs) {
// 4方向チェック
pos pre = pos(x,y);
pos p = a;
int cnt = 0;
while (true) {
cnt++;
if (p.x == x && p.y == y) {
// 戻ってきた
break;
}
int dx = p.x - pre.x;
int dy = p.y - pre.y;
int nx = p.x + dx;
int ny = p.y + dy;
bool straight = true;
if (nx<0||M<=nx||ny<0||N<=ny) straight = false;
if (b[ny][nx] == '#') straight = false;
// 右を見てみる
int rdx = -1 * dy;
int rdy = dx;
int rnx = p.x + rdx;
int rny = p.y + rdy;
if (!(rnx<0||M<=rnx||rny<0||N<=rny)) {
if (b[rny][rnx] == '.') {
// 右に行けるところがあるとダメ
break;
}
}
if (straight) {
// まっすぐ
pre = p;
p = pos(nx,ny);
} else {
// 左回転
swap(dx, dy);
dy *= -1;
nx = p.x + dx;
ny = p.y + dy;
straight = true;
if (nx<0||M<=nx||ny<0||N<=ny) straight = false;
if (b[ny][nx] == '#') straight = false;
if (!straight) break; // 行くところない
// 左行ける
pre = p;
p = pos(nx,ny);
}
}
if (total == cnt) return true;
}
return false;
}
signed main()
{
cin>>N>>M;
REP(i,N) cin>>b[i];
bool ok = false;
REP(x,M) REP(y,N) total += (b[y][x] == '.');
REP(x,M) REP(y,N) {
char c = b[y][x];
if (c == '#') continue;
if (isok(y,x)) {
ok = true;
break;
}
}
cout << (ok ? "YES" : "NO") << endl;
return 0;
}
koyopro