题目大意:有一个无限长的一维的棋盘,棋盘上N个格子放置着棋子。两个人轮流操作,每次操作能选择其中一个棋子向左移动,但不能越过其它棋子或者两枚棋子放在同一格中,最后不能操作的人算输,问先手是否必胜?

思路:就是裸的阶梯博弈(staircase nim)方法也很简单。首先每个棋子能向右移动的距离是有限的,最多到前一个棋子处就停止了,比如第一个sample :1 2 3 每个棋子都不能移动就是 0 0 0 第二个sample: 1 5 6 7 9 12 14 17 就是0 3 0 0 1 2 1 2 这样每次移动一枚棋子向左n步,相当于把对应第二排的那个数据减去n,那个数据右边一个数加上n
这样问题就转变成了:有n堆石头,每次可以从一堆中拿出一些或全部石头给相邻的右边的一堆石头,或者最后一堆减去一些或全部石头,谁不能操作谁输,问先手是否必胜?
关于这个问题的结论和证明网上多如牛毛,结论是:假设从最后一堆石头开始与上一堆相间的石头数的异或和为P,P为0时先手必败反之必胜。比如a1,a2,a3,a4,a5   P的值就是a5 xor a3  xor a1

证明无非就是说明当不为平衡态时必然存在操作使局面进入平衡态,而局面已然是平衡态时任何操作都会破坏平衡。这里不再累述。说一下对这个问题的一些直观认识:为了叙述方便,可以把与最后一堆石头相间的石头称为有用堆(这里是我生造的一个词)而其它堆称为无用

堆。

□■□■□■□■□■□

如图空心方块表示有用堆,实心方块表示无用堆,显然把无用堆的石头放到有用堆的操作都是没有意义的,因为这次从无用堆放进多少块石头到有用堆,下一次操作就能将这些运进来的石头扔给下一个无用堆或者扔掉(最后一堆石头),而有用堆石头的序列分毫未变,因此只需看有用堆的石头情况即可。而有用堆的石头放进无用堆相当于扔掉的操作,因为刚才已经证明无用堆中的石头是不起作用毫无意义的,这样就将问题化为了有用堆的NIM游戏!!因此只需计算有用堆的异或和就能计算出先手的胜负情况

//poj1704

#include<cstdio>

#include<string.h>

#include<iostream>

using namespace std;

int a[1009]={0};

void qsort(int l,int r)

{

int i=l,j=r,mid=a[(l+r)>>1],temp;

while(i<j)

{

while(a[i]<mid)i++;while(a[j]>mid)j--;

if(i<=j)

{

temp=a[i];a[i]=a[j];a[j]=temp;

i++;j--;

}

}

if(i<r)qsort(i,r);

if(l<j)qsort(l,j);

}

int main()

{

int n,t,chess[1009]={0};

scanf("%d",&t);

while(t--)

{

int x=0,last=0;

scanf("%d",&n);

for(int i=1;i<=n;i++)scanf("%d",&a[i]);

qsort(1,n);

for(int i=1;i<=n;i++)

{

chess[i]=a[i]-last-1;

last=a[i];

}

for(int i=n;i>=1;i=i-2)

x=x^chess[i];

if (x!=0)printf("Georgia will win\n");else printf("Bobwill win\n");

}

return 0;

}

调试小结:3次WA 原因:未看清棋子顺序不是从小到大!!

转载于:https://www.cnblogs.com/philippica/p/4006972.html

Poj1704:staircase nim【博弈】相关推荐

  1. 高僧斗法--Staircase Nim

    古时丧葬活动中经常请高僧做法事.仪式结束后,有时会有"高僧斗法"的趣味节目,以舒缓压抑的气氛. 节目大略步骤为:先用粮食(一般是稻米)在地上"画"出若干级台阶( ...

  2. 阶梯博弈(Staircase Nim)

    阶梯博弈!!!下面阐述一下我对于阶梯博弈的理解..   首先是对阶梯博弈的阐述...博弈在一列阶梯上进行...每个阶梯上放着自然数个点..两个人进行阶梯博弈...每一步则是将一个集体上的若干个点( & ...

  3. 我谈阶梯博弈( Staircase Nim )

    今天在POJ做了一道博弈题..进而了解到了阶梯博弈...下面阐述一下我对于阶梯博弈的理解.. 首先是对阶梯博弈的阐述...博弈在一列阶梯上进行...每个阶梯上放着自然数个点..两个人进行阶梯博弈... ...

  4. 我谈阶梯博弈(Staircase Nim)

    今天在POJ做了一道博弈题..进而了解到了阶梯博弈...下面阐述一下我对于阶梯博弈的理解..   首先是对阶梯博弈的阐述...博弈在一列阶梯上进行...每个阶梯上放着自然数个点..两个人进行阶梯博弈. ...

  5. staircase nim 经典组合游戏

    游戏开始时有许多硬币任意分布在楼梯上,共n阶楼梯从地面由下向上编号为0到n.游戏者在每次操作时可以将楼梯j(1<=j<=n)上的任意多但至少一个硬币移动到楼梯j-1上.游戏者轮流操作,将最 ...

  6. HDU 3590 PP and QQ(反nim博弈,删边游戏)

    PP and QQ 思路 删边游戏了解一下,其实就是个nim博弈吧,只是删边个数有特殊限制, 然后就是一个反nim博弈了. 删边定理: 遇到分叉口时,它的子树上的可操作的sg函数为所有子树节点的sg函 ...

  7. Be the Winner(结论:反nim博弈)

    Be the Winner 结论 记一个结论:反nim博弈,先手必胜1:尼姆和为零,所有值为1.2:尼姆和不为零,有一个大于1的数. 代码 /*Author : lifehappy */ #pragm ...

  8. Georgia and Bob(Poj 1704)Nim 博弈

    Georgia and Bob 思路 每个棋子只能向左移动并且不能越过其左边的棋子,这就有点像是经典的nim博弈了, 但是在这里后一个石子会受到其前一个石子位置的影响,这里就需要转化一下了. 我们假设 ...

  9. 博弈——Nim博弈(hdu2176,1850,1851,1907,1849)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2176 http://acm.hdu.edu.cn/showproblem.php?pid=1850 ...

最新文章

  1. Hive 基本语法操练(四):Hive 复合类型
  2. 手势识别之平移、缩放、长按、旋转、滑动
  3. python复数类型-python复数类型
  4. JSP连接SQL数据库实现数据分页显示
  5. 字符串对比 (STl强制转换字符串)
  6. InnoDB 的索引模型
  7. python层级抓取_python实现提取str字符串/json中多级目录下的某个值
  8. go语言的书籍的淘宝调查
  9. 按插入顺序排序的map
  10. [Phoenix] 十、全局索引设计实践
  11. 电子设计大赛可以用linux开发板嘛,【一转再转】电子设计大赛应该怎么准备?...
  12. 不开机win7计算机还原,Win7开机出现Windows错误恢复解决方法
  13. 12个免费矢量免抠素材网站
  14. Only the Paranoid Survive
  15. 《胜负无定数,敢拼搏成七分》的读后感
  16. Velodyne Lidar将被纳入罗素2000指数
  17. jzoj6384. 【NOIP2019模拟2019.10.23】珂学家
  18. 将十进制数对应的八进制、十六进制、十进制数输出
  19. android 区域 推流,Android——直播推流SDK
  20. 通用技术设计评价雷达图高考必看知识点

热门文章

  1. C#中XML、JSON、类T数据格式之间的转换
  2. ftp上传文件时出现 550 Permission denied,不是用户权限问题
  3. 网络 — MB/s、Mb/s、Mbps、Mbit/s、Kbps
  4. LocalDateTime与DateTimeFormatter,毫秒值,时间和文本转换
  5. 借助栈实现单链表的原地逆置
  6. 程序员通病:小厂薪资低,想跳槽,又担心面试过不了!
  7. Mesos 1.1.1 发布说明
  8. POSCMS 域名绑定
  9. 使用redis碰到maxmemory
  10. 基于CANOpen协议驱动直流无刷减速电机