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

hamayanhamayan's blog

Find Square [AIM Tech Round 5 (rated, Div. 1 + Div. 2) A]

http://codeforces.com/contest/1028/problem/A

縦N×横Mの盤面がある。
この盤面は最初は全て白色(W)だが、一部奇数の長さの正方形が黒色(B)で塗られている。
黒色の正方形の中心の座標を求めよ。

解法

http://codeforces.com/contest/1028/submission/42274562

実装問題であるが、実装方針を決めよう。
盤面が正しく塗られていると仮定して、左上(L,U)と右下(R,B)を求めよう。
すると、Lは黒色で塗られている中でのx座標の最小値である。
同様に、Rはx座標の最大値、Uはy座標の最小値、Bはy座標の最大値となる。
これらは簡単に求められる。
左上と右下が分かれば中心は縦横それぞれの平均を取った((L+R)/2, (U+B)/2)となる。

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

    int L = inf, R = -inf, U = inf, B = -inf;
    rep(y, 0, H) rep(x, 0, W) if (S[y][x] == 'B') {
        chmin(L, x);
        chmax(R, x);
        chmin(U, y);
        chmax(B, y);
    }

    int r = (U + B) / 2 + 1;
    int c = (L + R) / 2 + 1;
    printf("%d %d\n", r, c);
}