Reversi-(太原理工新生赛决赛-A)博弈思维

题目描述
翻转棋,有时也被称作黑白棋,是一种由两个玩家进行的棋类游戏,一方玩家控制白棋,另一方玩家控制黑棋,当一方玩家放置自己棋子后,如果有连续相邻的另一方玩家的棋子与当前棋子摆放在一条直线上,且直线上的另一端是自己颜色的棋子,则这些对方玩家的棋子都会变成己方玩家棋子的颜色,这种操作便称为翻转。 某日,Vanis、Qiy和Adolph外出比赛,乘坐了去X地的火车。火车上三个人感到很无聊,因此vanis提议玩翻转棋。为了方便游戏,他们对翻转棋做了简化,简化后的规则如下:

初始有个棋子连续放置,摆在一排,使用0表示白色棋子,1表示黑色棋子,Qiy使用黑色棋子并且先手操作,每个玩家每次只能在当前棋盘上所有棋子的最左边或最右边放置一枚棋子,并且需要保证在放置后至少翻转一个棋子,如果当前状态不存在满足此条件的操作,则跳过本次操作回合(除此情况外,不能跳过操作回合),如果某个状态双方玩家都无法操作,则游戏结束,此时自身颜色的棋子数多的一方获胜。这场游戏轮到Qiy与Vanis进行,Adolph希望知道如果双方都采取最优策略,谁能获得胜利。
举个例子,若初始棋盘为0010。
在这里插入图片描述
Qiy先手操作将黑子摆在最左侧,根据翻转规则,中间的两颗白色棋子被翻转成黑色。
在这里插入图片描述
Vanis操作,将白色棋子摆在最左侧,中间的四枚黑色棋子变成白色,此时双方玩家都无法操作,游戏结束,Vanis获胜。
在这里插入图片描述

输入描述:
第一行输入一个正整数n,表示初始棋子数目。

第二场输入一个长度为n的字符串,表示初始棋盘摆放,其中1表示黑色棋子,0表示白色棋子。

数据规范:

  • 1 \le n \le 10^61≤n≤10
    6

输出描述:
根据游戏结果输出"Vanis win"或"Qiy win"。(不含双引号)
示例1
输入
复制
4
0010
输出
复制
Vanis win
示例2
输入
复制
3
111
输出
复制
Qiy win
示例3
输入
复制
3
101
输出
复制
Qiy win
题意:给定一个由1/0组成的字符串,1是黑子,0是白子,规则是:每次放子只能在最左或最右并且有自己棋子颜色组成的两端可以把里面的棋子全部反转成自己的棋子,第一个人先放黑子,如果当前状态不存在满足此条件的操作,则跳过本次操作回合,直到两个人都无法操作为止。
思路:两端都为自己的棋子就可以变换,两人都无法操作即为所有棋子都变成一个颜色的了,看字符串初始两端,如果都为1,不管放不放旗子都可以操作,再放之后就都变成黑色的了。第一个人赢。如果两端有一端是黑色,因为黑棋先走,在另一段放上黑棋后,就都变成黑色的了,第一个赢。如果两端都是白色的,那么黑色放上去也无法操作,跳过第一个人,因为第二个人也无法操作,那么白色棋最多,即为第二个人赢。
代码:

#include<bits/stdc++.h>
using namespace std;
int main ()
{
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    string ch;
    cin>>ch;
    int sum=0;
    for(int i=0;i<ch.size();i++){
        if(i==0||i==ch.size()-1){
            if(ch[i]=='1')//判断两端1的个数
                sum++;
        }
    }
    if(sum>=1)
        cout<<"Qiy win"<<endl;//第一个人赢
    else
        cout<<"Vanis win"<<endl;//第二个人赢
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值