けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 377 B - Avoid Rook Attack (6Q, 灰色, 200 点)

チェスを題材とした問題

問題概要

8 x 8 のチェス盤のいくつかのマスにルーク(上下左右にどこまでも行く)が置かれている。

これらのどのルークにも取られないマスの個数を求めよ。

考えたこと

8 x 8 の盤面に対応する二次元配列を用意して、各ルークに取られてしまうマスをすべて '#' で埋めることにした。そして、'#' にならずに残っているマスの個数を数えることにする。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<string> S(8);
    for (int i = 0; i < 8; i++) cin >> S[i];

    // 新しい盤面 res に S をコピーしておいて、置けない場所にすべて '#' で埋める
    auto res = S;
    for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) {
        if (S[i][j] == '#') {
            // もとの盤面 S のマス (i, j) の上下左右を '#' で埋める
            for (int k = 0; k < 8; k++) {
                res[k][j] = '#';
                res[i][k] = '#';
            }
        }
    }
    int num = 0;
    for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) {
        if (res[i][j] == '.') num++;
    }
    cout << num << endl;
}