题目:Reversi
来源:第二届太原理工大学程序设计新生赛决赛(重现赛)

解题思路

在一条直线上下黑白棋。给定一个包含 n 个字符的 01 字符串 s,1 表示黑棋,0 表示白棋,Qiy 执黑棋先下。
如果某个状态双方玩家都无法操作,则游戏结束,此时自身颜色的棋子数多的一方获胜。

①如果 s 的头尾有一个是 1,那么 Qiy 在 s 的另一端放置 1,此时,
②要么 s 全变成 1,Qiy 赢了,
③要么 s 两端都为 1,中间还有 0,
④这时,Vanis 不管在 s 的前面还是后面放 0,又变成了 s 的头尾有一个是 1,这又变成了状态①,只有状态②是终止情况。

条件 s[0] == '1' || s[n-1] == '1' 包含了上述状态。

⑤如果 s 的头尾都是 0,s[0] != 1 && s[n-1] != 1
⑥要么,s 全是 0,Vanis 赢了,
⑦要么,s 两端是 0,中间还有 1,
⑧这时,Qiy 在 s 的一端放置 1,变成了 s 的两端一个是 1,一个是 0,
⑨这时,Vanis 在 1 的这端放 0,变成了状态⑥或⑦,只有⑥是终止情况。

状态①和⑧的区别在于,虽然都是 s 的一端为 1,一端为 0,但①状态出现后,是 Qiy 操作,而⑧出现后,是 Vanis 操作。

C++代码

#include<iostream>
using namespace std;

int main(){
    int n;
    cin >> n;
    string s;
    cin >> s;
    if(s[0] == '1' || s[n-1] == '1')
        cout << "Qiy win" << endl;
    else
        cout << "Vanis win" << endl;
    return 0;
}