SRM 400 番台の easy は簡単(ホントか)

問題

TopCoder Statistics - Problem Statement

解法

まず, 一回の白石の移動で目的の場所まで動かせたら Romeo の勝ちです。

そうでない場合は, Romeo は負けないように動かします。どんなふうに石を動かしても次に Strangelet が勝ってしまうなら, Strangelet の勝ちです。

以上のどちらでもない場合は, ある移動で白石が位置 x から 位置 y に移動した場合, 次の人は 位置 y から 位置 x に移動できるので, お互いににらみ合いが起きて引き分けになります。

class StonesGame {
public:
    string winner(int N, int M, int K, int L) {
        M--; L--;
        set<int> S;
        for (int i = 0; i < K; i++) {
            int l = M-K+1+i, r = M+i;
            if (l < 0 || r >= N) continue;
            int next = M-K+1+2*i;
            if (next == L) return "Romeo";
            S.insert(next);
        }
        int cnt = 0;
        for (int i = 0; i < K; i++) {
            int l = L-K+1+i, r = L+i;
            if (l < 0 || r >= N) continue;
            int next = L-K+1+2*i;
            if (S.find(next) != S.end()) cnt++;
        }
        if (cnt == S.size()) return "Strangelet";
        return "Draw";
    }
};