hogecoder

tsutaj 競技プログラミングの記録

TopCoder SRM 725 Div1 Easy: FiveRooks

するめうめ

tsutaj.hatenablog.com

問題概要

原文 → 掲載されてないぽい (unrated だから?)

 8 \times 8 の盤面にルークがいくつか置かれている。

行の座標どうしが unique に、列の座標どうしが unique になるようにルークを  5 つ選べ。

解説

 {}_{64} C_{5} \approx 7.6 \times 10^{6} なので、適当に全探索したら通ります。

ソースコード

class FiveRooks {
    public:
    const int S = 64;

    bool check(vector<string> board, int x) {
        int r = x / 8, c = x % 8;
        return board[r][c] == 'R';
    }

    void ins(set<int> &R, set<int> &C, vector<int> &ret, int x) {
        int r = x / 8, c = x % 8;
        R.insert(r);
        C.insert(c);
        ret.push_back(r);
        ret.push_back(c);
    }

    vector<int> find(vector<string> board) {
        rep(i,0,S) rep(j,i+1,S) rep(k,j+1,S) rep(l,k+1,S) rep(m,l+1,S) {
            bool ok = true;
            ok &= check(board, i);
            ok &= check(board, j);
            ok &= check(board, k);
            ok &= check(board, l);
            ok &= check(board, m);
            if(!ok) continue;

            vector<int> ret;
            set<int> R, C;
            ins(R, C, ret, i);
            ins(R, C, ret, j);
            ins(R, C, ret, k);
            ins(R, C, ret, l);
            ins(R, C, ret, m);

            if(R.size() != 5 || C.size() != 5) continue;
            return ret;
        }
        return vector<int>();
    }
};