题目描述
翻转棋,有时也被称作黑白棋,是一种由两个玩家进行的棋类游戏,一方玩家控制白棋,另一方玩家控制黑棋,当一方玩家放置自己棋子后,如果有连续相邻的另一方玩家的棋子与当前棋子摆放在一条直线上,且直线上的另一端是自己颜色的棋子,则这些对方玩家的棋子都会变成己方玩家棋子的颜色,这种操作便称为翻转。 某日,Vanis、Qiy和Adolph外出比赛,乘坐了去X地的火车。火车上三个人感到很无聊,因此vanis提议玩翻转棋。为了方便游戏,他们对翻转棋做了简化,简化后的规则如下:
初始有个棋子连续放置,摆在一排,使用0表示白色棋子,1表示黑色棋子,Qiy使用黑色棋子并且先手操作,每个玩家每次只能在当前棋盘上所有棋子的最左边或最右边放置一枚棋子,并且需要保证在放置后至少翻转一个棋子,如果当前状态不存在满足此条件的操作,则跳过本次操作回合(除此情况外,不能跳过操作回合),如果某个状态双方玩家都无法操作,则游戏结束,此时自身颜色的棋子数多的一方获胜。这场游戏轮到Qiy与Vanis进行,Adolph希望知道如果双方都采取最优策略,谁能获得胜利。
举个例子,若初始棋盘为0010。
Qiy先手操作将黑子摆在最左侧,根据翻转规则,中间的两颗白色棋子被翻转成黑色。
Vanis操作,将白色棋子摆在最左侧,中间的四枚黑色棋子变成白色,此时双方玩家都无法操作,游戏结束,Vanis获胜。
输入描述:
第一行输入一个正整数n,表示初始棋子数目。
第二场输入一个长度为n的字符串,表示初始棋盘摆放,其中1表示黑色棋子,0表示白色棋子。
数据规范:
1≤n≤10^6
输出描述:
根据游戏结果输出"Vanis win"或"Qiy win"。(不含双引号)
示例1
输入
4
0010
输出
Vanis win
示例2
输入
3
111
输出
Qiy win
示例3
输入
3
101
输出
Qiy win
思路:这题你要真的去想它的原理,真得不知道如何去想,不过你可以多找几个数据好好观察一下规律。最后能得到两边都是0的时候,先手必败,其余情况后手必败。(题做的多了很快就能看出来规律)
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
int main()
{
int n;
string str;
cin>>n;
cin>>str;
int len=str.size();
int ret=0;
if(str[0]=='0'&&str[len-1]=='0')
cout<<"Vanis win"<<endl;
else cout<<"Qiy win"<<endl;
system("pause");
return 0;
}