チェスを題材とした問題
問題概要
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; }