ABC 276
Table of Contents
E - Round Trip
https://atcoder.jp/contests/abc276/tasks/abc276_e
start から BFS をする。
- start から右移動から始めたところには 1
- start から左移動から始めたところには 2
- start から上移動から始めたところには 3
- start から下移動から始めたところには 4
といった具合に番号を振っていく。(番号が異なれば良いので上下左右と番号の対応が上記と違っても問題ない) 異なる番号が隣り合うところがあれば異なる経路で同じ場所にたどり着けるということなので Yes、そのような場所がなければ No を出力する。
sample 1 の場合の番号の付け方の例は以下のよう
3 3 3 1
-1 3 -1 1
2 0 1 1
2 -1 -1 1
void solve() {
int H, W;
cin >> H >> W;
vector<string> grid(H);
rep(i, H) cin >> grid[i];
int si, sj;
rep(i, H) rep(j, W) if (grid[i][j] == 'S') si = i, sj = j;
vvint mark(H, vint(W, -1));
queue<pair<int, int>> q;
q.push({si, sj});
mark[si][sj] = 0;
vint di = {0, 1, 0, -1};
vint dj = {1, 0, -1, 0};
while (q.size()) {
auto [i, j] = q.front();
q.pop();
int c = mark[i][j];
int start = c == 0;
rep(d, 4) {
if (start)
c = d + 1;
int ni = i + di[d], nj = j + dj[d];
if (clamp(ni, 0, H - 1) != ni || clamp(nj, 0, W - 1) != nj)
continue;
if (grid[ni][nj] == '#')
continue;
int m = mark[ni][nj];
if (m > 0 && m != c) {
yesno(true);
return;
}
if (m == -1) {
mark[ni][nj] = c;
q.push({ni, nj});
}
}
}
yesno(false);
}