SRM725 Lv1 : FiveRooks

作成日:2017.12.11
最終更新日:2017.12.11

問題概要

 $8 \times 8$の大きさのチェス盤の半数を超えるマスにルークが置かれている。 これらのルークのうち5つを選ぶ。 ある行またはある列に選んだルークが2つ以上あってはならない。 この条件を満たすルークの選び方は必ず存在する。そのうちの1つを求めよ。
制約
$board[r][c]$が$R$の時、$r$行$c$列にルークが存在する($0 \leq r,c \leq 7$)

考え方

 制約が小さいので全探索ができる。 具体的には、行$r$に列$c_r$を割り当てた後$board[r][c_r]$のうち5つ以上が$R$であれば、そのうちの5つを選べば良い。 列の割り当て方は$8!$通りあるが、これを列挙するのはnext_permutationを用いれば容易に行える。

ソースコード

マクロ等はこちら

class FiveRooks {
public:
	vector<int> find(vector<string> board) {
		vector<int> P = {0,1,2,3,4,5,6,7};
		do {
			vector<int> ans;
			int c = 0;
			repp(i,0,8) if(board[i][P[i]]=='R'){
				ans.push_back(i);
				ans.push_back(P[i]);
				++c;
				if(c==5) return ans;
			}
		} while(next_permutation(P.begin(),P.end()));
		return vector<int>();
  	}
};

解法まとめ

 行に割り当てる列をnext_permutationを用いてすべて試す。(4-14行)

SRM725の他の問題 Lv2 Lv3

自己紹介

プログラミングとか合成音声とか
詳しくはこちら
twitter

プライバシーポリシー

個人情報利用についてはこちら

最終更新日:2023.03.05

お問い合わせ

このページに関するお問い合わせはこちら

競技プログラミングMENU

問題を解くまでの道のり

その他

全体MENU

寄付モドキ

0冂から10000冂まで
詳しくはこちら