chacoderのブログ

競技プログラミングそのほか

AtCoder Typical Contest 001 A 深さ優先探索

再帰でDFSを書く練習。
再帰があまり怖くなくなった。

簡単なDFSが自力で書けるようになったけどまだ時間がかかる。
いつでもすらすらスムーズに書けるようになりたい。

#include <bits/stdc++.h>
using namespace std;
static const int INF = 1000000;
int H, W;
char C[510][510];
int D[510][510];
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,-1,1 };

void bfs(int x, int y) {
    for (int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        //if (nx < 0 || nx >= H || ny < 0 || ny >= W)continue;
        if (C[nx][ny] != '.' && C[nx][ny] != 'g') continue;
        if (D[nx][ny] != INF) continue;
        D[nx][ny] = 0;
        bfs(nx, ny);
    }
    return;
}


int main() {
    cin >> H >> W;

    //スタート ゴール変数設定
    int sx, sy, gx, gy;

    //入力
    for (int i = 0; i < H; i++) {
        for (int j = 0; j < W; j++) {
            cin >> C[i][j];
            if (C[i][j] == 's') {
                sx = i; sy = j;
            }
            if (C[i][j] == 'g') {
                gx = i; gy = j;
            }
        }
    }
    //初期化
    for (int i = 0; i < 510; i++) {
        for (int j = 0; j < 510; j++) {
            D[i][j] = INF;
        }
    }
    /*for (int i = 0; i < H; i++) {
        for (int j = 0; j < W; j++) {
          cout<<D[i][j];
        }
    cout<<endl;
  }*/
  
  
  
    D[sx][sy] = 0;
    bfs(sx, sy);
    if (D[gx][gy] == INF) {
        cout << "No" << endl;
    }
    else {
        cout << "Yes" << endl;
    }
  
  
  /*for (int i = 0; i < H; i++) {
        for (int j = 0; j < W; j++) {
          cout<<D[i][j];
        }
    cout<<endl;
  }*/
  
   
    return 0;
}