HDU3032->SG函数

原创 2016年08月28日 18:27:57

HDU3032->SG函数


题意:

两个人玩游戏,有n堆石子,每堆个数不等,可以进行的操作是从任一堆中取任意颗石子,或者把这堆石子分成两堆。
给出一个初始的局面,判断先手胜还是后手胜。

题解:
sg(n)代表从当前状态到游戏结束最多需要多少步

当有n堆石子时,游戏相当于一个组合博弈,当前的sg值就是每堆石子的sg值异或的结果。

对于任意的一个 Anti-SG 游戏,如果我们规定当局面中所有单一游戏的 SG 值为 0 时游戏 结束,则先手必胜当且仅当以下两个条件满足任意一个:

(1)游戏的 SG 函数不为 0,且游戏中某个单一游戏的 SG 函数大于1。

(2)游戏的 SG 函数为 0,且游戏中没有单一游戏的 SG 函数大于 1。

很明显:sg(0) = 0,sg(1) = 1。

状态2的后继有:0,1和(1,1),他们的SG值分别为0,1,0,所以sg(2) =2。

状态3的后继有:0、1、2、(1,2),他们的SG值分别为0、1、2、3,所以sg(3) = 4。

状态4的后继有:0、1、2、3、(1,3)和(2,2),他们的SG值分别为0,1,2,4,5,0,所以sg(4) = 3.

打表可以发现规律:

if(x%4==0) sg[x]=x-1;
if(x%4==1||x%4==2) sg[x]=x;
if(x%4==3) sg[x] = x+1。

代码:

#include <stdio.h>
#include <iostream>
using namespace std ;
int main()
{
    int T , n , m;
    int res ;
    scanf("%d" , &T) ;
    while(T --)
    {
        scanf("%d" , &n) ;
        res = 0 ;
        while(n --)
        {
            scanf("%d" , &m) ;
            if(m%4 == 0) res^=(m - 1) ;
            if(m%4==1||m%4==2) res^=m ;
            if(m%4==3) res^=(m+1) ;
        }
        if(res == 0) printf("Bob\n") ;
        else printf("Alice\n") ;
    }
    return 0 ;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HDOJ3032 Nim or not Nim? (sg打表)

题意:题意:规则和nim博弈取n堆石子一样,n堆石子,游戏双方每次可以取某一堆的任意个,不可以不取,还可以把一堆分成两堆,最后没办法操作的一方为输家! 题解:Lasker's Nim游戏,通过打表可...
  • Ezereal
  • Ezereal
  • 2016年07月22日 15:04
  • 154

1065. A+B and C (64bit) (20)

这一题的分不值高精度,但是题目的范围整数包括2^64啊,最然测试数据没有;然后很奇怪的,第三个和第二个代码就是sum的区别,但是第三个代码就是过不了...

POJ1185 炮兵阵地 状态压缩DP

这题是个入门的状压dp(虽然对我来说好难啊,坑了一下午终于过了。。。)难得一个中文题,还这么难 注意点挺多的,首先是要开数组记录所有情况,然后记录每种情况的炮兵数,很多处理类似于前一题3254,可以参...

HDU 3032 Nim or not Nim?(sg函数博弈)

题目地址:HDU 3032 这题是很好用来练习sg函数打表的一题。 下面是sg函数值打表代码: #include #include #include #include #include ...

(HDU 3032) Nim or not Nim(SG函数、博弈)

思路 打表代码 打表发现是以4位单位循环的 #include using namespace std; int g[1010]; void init() { memset(g, -1,...

Nim or not Nim?(hdu3032+SG函数)取走-分割游戏,经典

Nim or not Nim? Description Nim is a two-player mathematic game of strategy in which players take tu...

hdu3032 Nim or not Nim?(SG函数)

Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)...
  • d_x_d
  • d_x_d
  • 2016年08月04日 23:54
  • 422

hdu3032 Nim or not Nim?-----sg打表找规律 允许把一堆石子分成两堆小的

Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)...

SG-3032JC_IcpdfCom_1114680.pdf

  • 2013年03月21日 23:16
  • 81KB
  • 下载

hdu5724——chess(博弈)(状态压缩dp+sg函数)

Problem Description: Alice and Bob are playing a special chess game on an n × 20 chessboard. There ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU3032->SG函数
举报原因:
原因补充:

(最多只允许输入30个字)