C - Avoid Rook Attack Editorial
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;
}
posted:
last update: