第二届太原理工大学程序设计新生赛决赛 A Reversi

题目传送门

题目描述
翻转棋,有时也被称作黑白棋,是一种由两个玩家进行的棋类游戏,一方玩家控制白棋,另一方玩家控制黑棋,当一方玩家放置自己棋子后,如果有连续相邻的另一方玩家的棋子与当前棋子摆放在一条直线上,且直线上的另一端是自己颜色的棋子,则这些对方玩家的棋子都会变成己方玩家棋子的颜色,这种操作便称为翻转。 某日,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;


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值