环上的游戏

环上的游戏(cycle)
有一个取数的游戏。初始时,给出一个环,环上的每条边上都有一个非负整数。这些整数中至少有一个0。然后,将一枚硬币放在环上的一个节点上。两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流取数,取数的规则如下:
(1)选择硬币左边或者右边的一条边,并且边上的数非0;
(2)将这条边上的数减至任意一个非负整数(至少要有所减小);
(3)将硬币移至边的另一端。
如果轮到一个玩家走,这时硬币左右两边的边上的数值都是0,那么这个玩家就输了。
如下图,描述的是Alice和Bob两人的对弈过程,其中黑色节点表示硬币所在节点。结果图(d)中,轮到Bob走时,硬币两边的边上都是0,所以Alcie获胜。

现在,你的任务就是根据给出的环、边上的数值以及起点(硬币所在位置),判断先走方是否有必胜的策略。
【输入格式】
第一行一个整数N(N≤20),表示环上的节点数。
第二行N个数,数值不超过30,依次表示N条边上的数值。硬币的起始位置在第一条边与最后一条边之间的节点上。
【输出格式】
仅一行。若存在必胜策略,则输出“YES”,否则输出“NO”。
【样例】
cycle1.in
4
2 5 3 0
cycle1.out
YES

cycle2.in
3
0 0 0
cycle2.out
NO

最后取到数的人获胜

解:首先根据题意分析可得假使走过一条边那么每次将它一点点减小到0

和一次性将它减小到0是一样的,那么不妨每走过一条边,就将边上的数值

减为0;

数据范围n<=20

那么我们可以搜索所有的可行路线,

(相当于剪枝)一旦存在先手赢的做法,就返回

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<string>
 7 using namespace std;
 8 int n,a[30];
 9 int L(int x)
10 {
11     int p=(x-1+n)%n;
12     if(p==0) p=n;
13     return p;
14 }
15 int R(int x)
16 {
17     int p=(x+1+n)%n;
18     if(p==0) p=n;
19     return p;
20 }
21 bool fg;
22 //1 Alice 2 Bob
23 void dfs(int nw,int peo)
24 {
25 //    cout<<"uu "<<nw<<" "<<peo<<endl;
26     if(fg) return;
27     if(a[nw]==0 && a[L(nw)]==0)
28     {
29        if(peo==2) fg=1;
30        return;
31     }
32     if(a[nw])
33     {
34         int tmp=a[nw];a[nw]=0;
35         dfs(R(nw),3-peo);
36         a[nw]=tmp;
37     }
38     if(a[L(nw)])
39     {
40         int tmp=a[L(nw)];a[L(nw)]=0;
41         dfs(L(nw),3-peo);
42         a[L(nw)]=tmp;
43     }
44 }
45 int main()
46 {
47     freopen("cycle.in","r",stdin);
48     freopen("cycle.out","w",stdout);
49     scanf("%d",&n);
50     for(int i=1;i<=n;++i) scanf("%d",&a[i]);
51     dfs(1,1);
52 //    for(int i=1;i<=n;++i)
53 //     cout<<i<<" PPP "<<L(i)<<" "<<R(i)<<endl;
54     if(fg) printf("YES");
55     else printf("NO");
56     return 0;
57 }//数据范围小,搜索 

代码

原文地址:https://www.cnblogs.com/adelalove/p/9096908.html

时间: 2024-11-07 01:45:20

环上的游戏的相关文章

如何在Android和iOS设备上录制游戏?

内容简介 如何在Android和iOS设备上录制游戏? 如何在Android和iOS设备上录制游戏? Xbox One,PS4,Windows 10等都集成了游戏录制功能,而且可以把录制的视频分享到网上. 现在,Android和iOS设备也可以实现游戏录制了. 怎么做呢?我们分为Android和iOS平台来介绍. Android平台 首先下载安装一个App,叫做<Google Play Games>. 运行此App,在菜单中点击<My Game>(英语<我的游戏>的意思

【用PS3手柄在安卓设备上玩游戏系列】FC(任天堂NES/FC主机)模拟器

NESoid 是安卓系统下公认最好的FC模拟器.据我所知,现在安卓系统下面的绝大部分的FC模拟器,都是基于 NESoid 的内核来开发的. 官方网站:http://www.nesoid.com NESoid 是原生支持实体手柄的,下面以<超级魂斗罗>为例说明我的设置步骤: Step1:运行 SixaxisController(以下简称 SC),连接手柄和设备,我的设备是小米2: Step2:扩展菜单按钮 > 设置 > 手柄设置,勾选"启用手柄",然后选择&quo

【用PS3手柄在安卓设备上玩游戏系列】谈安卓游戏对手柄的支持

不同的游戏对于手柄的支持程度是不一样的,对应所需要进行的手柄设置也不尽相同.我没有这样的时间和精力,针对每一款游戏去写博客,但找出不同游戏中的共同点,针对同一类的游戏去写博客,应该是可行的.我把安卓上的游戏分成下面四种类型: 1.原生支持实体手柄的 安卓系统本身是支持实体手柄的.淘宝上面随便一搜"安卓手柄",就能找到各种外设厂商针对安卓系统定制的游戏手柄.游戏厂商跟外设厂商的支持总是相辅相成的,在游戏厂商的支持下,有些游戏是原生支持手柄的.这里的"原生"二字,强调的

51nod-1661 1661 黑板上的游戏(组合游戏)

题目链接: 1661 黑板上的游戏 Alice和Bob在黑板上玩一个游戏,黑板上写了n个正整数a1, a2, ..., an,游戏的规则是这样的:1. Alice占有先手主动权.2. 每个人可以选取一个大于1的数字擦去,并写上一个更小的数字,数字必须是整数,然后由对方进行下一次操作.3. 如果擦去的数字是 x (x > 1) ,则写上的数字不能比 x/k 小,但是要比 x 小.这里的除法为有理数除法.4. 不可以擦去任何一个数字 1 ,如果当前无法找到一个数字进行操作,则当前方输.假设Alice

Codeforces Round #369 (Div. 2) D. Directed Roads dfs求某个联通块的在环上的点的数量

D. Directed Roads ZS the Coder and Chris the Baboon has explored Udayland for quite some time. They realize that it consists of n towns numbered from 1to n. There are n directed roads in the Udayland. i-th of them goes from town i to some other town 

JUMP上楼梯游戏IOS源码

基于cocos2d-x的简单JUMP上楼梯游戏,配有音效.适合新接触cocos2d的同学学习.规则类似 “是男人就上100层”的经典小游戏,就是控制宝宝通过跳上不同高度的踏板而慢慢升高. <ignore_js_op> <ignore_js_op> 详细说明:http://ios.662p.com/thread-1711-1-1.html

poj 2947 Widget Factory(模7环上的高斯消元)

http://poj.org/problem?id=2947 大致题意: 有n种装饰物,m个已知条件,每个已知条件的描述如下: p start end a1,a2......ap (1<=ai<=n) 第一行表示从星期start到星期end一共生产了p件装饰物(工作的天数为end-start+1+7*x,加7*x是因为它可能生产很多周),第二行表示这p件装饰物的种类(可能出现相同的种类,即ai=aj).规定每件装饰物至少生产3天,最多生产9天.问每种装饰物需要生产的天数.如果没有解,则输出&q

九成用户都在电视上玩游戏是种什么体验?

选择以游戏作为智能盒子乃至智能电视的突破点,国内厂商并非仅仅为了那看得见够不着的9成用户大蓝海.而是不搞游戏,智能盒子就是个卖硬件的. 本文为张书乐供IT时代网.IT时代周刊专稿,作者微信号:zsl13973399819 7月9日,红网记者做了一个<电视游戏,你玩过吗?>网络调查,截至7月9日16:00,共收到215个投票,仅1成网友表示偶尔会通过电视来玩游戏,PC和移动设备仍然是主流的游戏平台. 尽管样本量很小,但对于这个结果,笔者并不感到奇怪.撇开专业的视频游戏机不算,至少在安卓系统下的智

环上最大连续和

给定N,K以及一个环:A[1],A[2],A[3],...A[N],其中A[1]的左边是A[N]. 求该环上最大的连续子段和,要求选出的子段长度不超过K. 输入描述: 第一行两个整数N和K.接下来一行,N个整数表示A[i]. 输出描述: 输出题目要求的最大连续和. 求Max{sum[i]-sum[x]},单调队列维护sum[x]. code #include<cstdio> #include<iostream> #include<cstring> #include<