C - Avoid Rook Attack 解説 by MMNMM

より高速な解法

置くことができるマスの構造について考察を進めることで、この問題をより高速に解くこともできます。

置くことができるマスは、その行にコマが置かれておらず、その列にコマが置かれていないマスです。 よって、そのようなマスの個数は \((\)コマが置かれていない行の数\()\times(\)コマが置かれていない列の数\()\) に等しいです。

あとは、これを実装することでマス目の大きさを \(N\times N\) として \(O(N ^ 2)\) 時間でこの問題を解くことができます。

#include <algorithm>
#include <array>
#include <iostream>

using namespace std;

int main() {
    // 各行・各列にコマがあるか
    // はじめはすべて false にしておく
    array<bool, 8> row{}, column{};

    for (int i = 0; i < 8; ++i) {
        for (int j = 0; j < 8; ++j) {
            char c;
            cin >> c;
            // コマが置かれていたら
            if (c == '#') {
                // 対応する行と列を true に
                row[i] = true;
                column[j] = true;
            }
        }
    }

    // false の行数 × false の列数 が答え
    cout << ranges::count(row, false) * ranges::count(column, false) << endl;

    return 0;
}

投稿日時:
最終更新: