题目: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;
}
京公网安备 11010502036488号