ATC001 A - 深さ優先探索
目次
# 問題
https://atcoder.jp/contests/atc001/tasks/dfs_a
# 入力
...
c_{H-1,0} c_{H-1,1} ... c_
- - 長方形の縦
- - 長方形の横
- -
'.'
,'#'
,'s'
,'g'
のいずれか
# 出力
長方形の中s
から出発し、.
のみを通ってg
へたどり着けるかどうかを答える問題です.
上下左右の.
のみに移動でき、斜めには移動できません.
# 解説
スタート地点s
から開始し、行けるところまで移動を繰り返しg
にたどり着いたらYes
、辿り着く前に移動できる場所がなくなったらNo
で正解です.
移動の際に上下左右に4分岐するので計算量はという感じがします.
が、実際には長方形のマス目の数は最高でで、同じマス目を2度調べないように気をつければとなります.
マス目を移動する際には長方形の外にはみ出していないか、#
を通っていないか、すでに通っていないかをチェックします.
# 計算量
# 解答
#define MAX_N 501
Int H, W;
vector<bool> C(MAX_N*MAX_N, true);
Int sx, sy, gx, gy;
void dump(Int x, Int y, Int depth) {
cout << "\033c";
sleep_for(16ms);
loop(h,0,H) {
loop(w,0,W) {
if (w == x && h == y) cout << "O";
else cout << ".";
}
cout << endl;
}
}
void input() {
char x;
cin >> H >> W;
loop(h,0,H) {
loop(w,0,W) {
cin >> x;
if (x == '#') C[h*W + w] = false;
else if (x == 's') sx = w, sy = h;
else if (x == 'g') gx = w, gy = h;
}
}
}
bool dfs(Int x, Int y, Int depth) {
// dump(x, y, depth);
if (gx == x && gy == y) return true;
C[y*W+x] = false;
loop(dy,-1,2) {
loop(dx,-1,2) {
if (dy != 0 && dx != 0) continue;
Int x_ = x + dx, y_ = y + dy;
if (x_ < 0 || W <= x_ || y_ < 0 || H <= y_) continue;
if (!C[y_*W + x_]) continue;
if (dfs(x_, y_, depth+1)) return true;
}
}
return false;
}
void solve() {
if (dfs(sx, sy, 0)) cout << "Yes" << endl;
else cout << "No" << endl;
}
int main(void) {
input();
solve();
return 0;
}