Poj1704:staircase nim【博弈】

题目大意:有一个无限长的一维的棋盘,棋盘上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 原因:未看清棋子顺序不是从小到大!!

时间: 2024-10-13 16:22:53

Poj1704:staircase nim【博弈】的相关文章

Nim博弈&amp;&amp;POJ1704

Nim博弈 题目 有n堆物品,两人轮流取,每次取某堆中不少于1个,先取完者胜. 分析 经典问题,该问题的策略也成为了许多问题的基础. 要判断游戏的胜负只需要异或运算就可以了,有以下结论: $a_1 \ xor \ a_2\ xor ...  \ xor a_n \neq 0$,必胜态 $a_1 \ xor \ a_2\ xor ...  \ xor a_n =  0$,必败态 为什么是异或运算呢? //下面这段话为口胡 异或运算能保证必败态只能转移到必胜态,也就是说,当异或和为0时,从某一堆中任

ACM学习历程—HDU 3915 Game(Nim博弈 &amp;&amp; xor高斯消元)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3915 题目大意是给了n个堆,然后去掉一些堆,使得先手变成必败局势. 首先这是个Nim博弈,必败局势是所有xor和为0. 那么自然变成了n个数里面取出一些数,使得xor和为0,求取法数. 首先由xor高斯消元得到一组向量基,但是这些向量基是无法表示0的. 所以要表示0,必须有若干0来表示,所以n-row就是消元结束后0的个数,那么2^(n-row)就是能组成0的种数. 对n==row特判一下. 代码:

UVA 11859 Division Game (Nim博弈)

题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32746 题意:有一个n*m(1<=n,m<=50)矩阵,每个元素均为2~10000之间的正整数,两个游戏者轮流操作.每次可以选一行中的1个或者大于1的整数,把他们中的每个数都变成它的某个真因子,比如12可以边长1,2,3,4或者6,不能操作的输. 分析:考虑每个数包含的素因子个数(比如12=2*2*3包含3个素因子),则让一个数"变成它的素因子"

hdu 5011 (nim博弈模版)

//nim博弈 //有n堆石头,两人轮流每次从一堆中拿至少1,之多全部的石头,没有石头可拿为lose //判断先手是win还是lose # include <stdio.h> # include <algorithm> # include <string.h> using namespace std; int main() { int n,i; __int64 a,sum; while(~scanf("%d",&n)) { sum=0; fo

HDU 1849 Rabbit and Grass(nim博弈)

题目地址:HDU 1849 初次接触nim博弈,感觉好神奇的说...居然可以跟异或运算扯上关系....给人类的智商跪了...作为地球人我感到很自豪.. 具体证明什么的看这篇博客被.传送门 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #inclu

HDU 1907 Nim博弈变形

1.HDU 1907 2.题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输. 3.总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 分析:经典的Nim博弈的一点变形.设糖果数为1的叫孤独堆,糖果数大于1的叫充裕堆,设状态S0:a1^a2^..an!=0&&充裕堆=0,则先手必败(奇数个为1的堆,先手必败).S1:充裕堆=1,则先手必胜(若剩下的n-1个孤独堆个数为奇数个,那么将那个充裕堆全部拿掉,否则将那个充裕堆拿得只剩一个,这样的话先手必胜).T0:a1

UVA 1559 - Nim(博弈dp)

UVA 1559 - Nim 题目链接 题意:一开始有s个石子,2n个人轮流取石子,每个人有个最大能取数目,2n个人奇数一队,偶数一队,取到最后一个石子的队输,问谁赢 思路:记忆化搜索,每个人取的时候对应的后继状态如果有一个必败态,则该状态为必胜态,如果都是必胜态,则该状态为必败态 代码: #include <stdio.h> #include <string.h> int n, s, m[25], dp[25][10005]; int dfs(int now, int state

ZOJ 3529 A Game Between Alice and Bob (分解质因数+Nim博弈)

A Game Between Alice and Bob Time Limit: 5 Seconds      Memory Limit: 262144 KB Alice and Bob play the following game. A series of numbers is written on the blackboard. Alice and Bob take turns choosing one of the numbers, and replace it with one of

[Nim博弈]hdu 1850 Being a Good Boy in Spring Festival

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1850 Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4053    Accepted Submission(s): 2394 Problem Description