题目: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; }