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

hamayanhamayan's blog

Futon [HHKB プログラミングコンテスト 2020 B]

https://atcoder.jp/contests/hhkb2020/tasks/hhkb2020_b

解説

https://atcoder.jp/contests/hhkb2020/submissions/17315225

布団を敷く可能性がある場所をすべて全探索することで答える。

横置きの場合

横置きする場合の布団を置く可能性がある場所は、横置きの左の座標でカウントすると考えると、H×(W-1)通りになる。
これは104通りくらいなので、全列挙は問題ない。
後は、左の座標と右の座標がどちらも散らかっていないなら、置けるとしてカウントする。

縦置きの場合

これも同様である。
縦置きする場合の布団を置く可能性がある場所は、縦置きの上の座標でカウントすると考えると、W×(H-1)通りになる。
これは104通りくらいなので、全列挙は問題ない。
後は、上の座標と下の座標がどちらも散らかっていないなら、置けるとしてカウントする。

int H, W;
string S[101];
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> H >> W;
    rep(y, 0, H) cin >> S[y];

    int ans = 0;
    // 横置き
    rep(y, 0, H) rep(x, 0, W - 1) if (S[y][x] == '.' && S[y][x + 1] == '.') ans++;
    // 縦置き
    rep(y, 0, H - 1) rep(x, 0, W) if (S[y][x] == '.' && S[y + 1][x] == '.') ans++;
    cout << ans << endl;
}