はまやんはまやんはまやん

hamayanhamayan's blog

Visibility [AtCoder Beginner Contest 197(Sponsored by Panasonic) B]

https://atcoder.jp/contests/abc197/tasks/abc197_b

解説

https://atcoder.jp/contests/abc197/submissions/21324614

宗教上の理由により、縦は長さHで変数yを、横は長さWで変数xを使うと決めているので、
それに従って問題の解釈を変えている。
つまり、XとYを逆にして使っている。
もし宗教違いで読みにくかったらすまない。

愚直シミュレーション

こういう盤面上での移動については実装について慣れていないと高速に行えないと思う。
今回要求されていることはある始点から上下左右に行けるまで行ってマス目を数えるというもの。
こういう上下左右に動くという場合には、dxdyを使った実装がオススメである。
実装を見てもらえれば分かるが、行けるまで行ってダメなら終了というのを無限ループを使って実装している。
始点を重複して数えないように注意すること。

int H, W, X, Y;
string S[101];
int dx[4] = { 0, 1, 0, -1 }, dy[4] = { -1, 0, 1, 0 };
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> H >> W >> Y >> X;
    X--; Y--;
    rep(y, 0, H) cin >> S[y];

    int ans = 1;
    rep(d, 0, 4) {
        int x = X, y = Y;
        while (1) {
            x += dx[d];
            y += dy[d];

            // 外に出たら終了
            if (x < 0 || W <= x || y < 0 || H <= y) break;

            // 行き止まりなら終了
            if (S[y][x] == '#') break;

            ans++;
        }
    }
    cout << ans << endl;
}