hdu 1848 博弈之SG函数的使用

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1848

题目简单描述为:

1、  这是一个二人游戏;
2、  一共有3堆石子,数量分别是m,
n,
p个;
3、  两人轮流走;
4、  每走一步可以选择任意一堆石子,然后取走f个;
5、  f只能是菲波那契数列中的元素(即每次只能取1,2,3,5,8…等数量);
6、  最先取光所有石子的人为胜者;

假设双方都使用最优策略,请判断先手的人会赢还是后手的人会赢。

代码为:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <stdlib.h>

int f[1005],sg[1005],hash[1005];

void
GetSg(int
n)

{

      int
i,j;

      memset(sg,0,sizeof(sg));

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

      {

            memset(hash,0,sizeof(hash));

            for(j=1;f[j]<=i;j++)

            {

                 hash[sg[i-f[j]]]=1;

            }

            for(j=0;j<=n;j++)

            {

                 if(hash[j]==0)

                 {

                     sg[i]=j;

                     break;

                 }

            }//printf("%d",sg[n]);

      }

}

int
main()

{

     int
i,j,m,n,p;

     f[0]=1;f[1]=1;

     for(i=2;i<=16;i++)

     {

          f[i]=f[i-2]+f[i-1];

     }

     GetSg(1001);

     while(scanf("%d%d%d",&m,&n,&p)!=EOF&&m||n||p)

     {

             if((sg[m]^sg[n]^sg[p]))

             {

                  printf("Fibo\n");

             }

             else

             {

                  printf("Nacci\n");

             }

     }

     return
0;

}

  ===============================================================================================

看了一星期的SG函数,现在才算懂那么一点点,看了张一飞大神的论文,果然写的很好,堪称经典之作

接下来看了:http://www.cnblogs.com/frog112111/p/3199780.html这里的博客,SG模板,又看了好长时

间才看懂,程序的巧妙之处,看许多次才能领略

我简单说一下:y是x的后继,说的是x下一步可以到达的状态y,f[] 保存的是取石子的规则,可以取的种类

hash[]数组保存所有后继值,sg[]数组保存最小的不属于这个集合的非负整数

如果你看不懂以上所说,那就取百度下张一飞大神的论文,一点点耐心看完!

hdu 1848 博弈之SG函数的使用,布布扣,bubuko.com

时间: 2025-01-26 20:24:46

hdu 1848 博弈之SG函数的使用的相关文章

HDU 1536 S-Nim 求SG函数

题意:给你n个数Nnum[ i ],表示每次只能取Nnum[ i ]个数. m个问题:每次给你 l 堆石子,每堆有num个石子,问先手是否会赢. Sample Input 2 2 5 3 2 5 12 3 2 4 7 4 2 3 7 12 5 1 2 3 4 5 3 2 5 12 3 2 4 7 4 2 3 7 12 0 Sample Output LWW WWL 经典Nim游戏,找出SG就可以了. 至于如何找SG,这里有详细的 点我 #include<cstdio> #include<

HDU 5724 Chess(SG函数)

Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2605    Accepted Submission(s): 1092 Problem Description Alice and Bob are playing a special chess game on an n × 20 chessboard. There are s

hdu 1729 Stone Game SG函数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1729 题意:2个玩家,有N个箱子,每个箱子的大小是Si,游戏开始前,就有一些石子在这些箱子里了. 游戏者轮流选择箱子,然后把石子放入箱子里.并且放入的石子数量不能大于原来箱子里就有的石子的数量的平方. 比如说,一个箱子里已经有了3个石头,则可以放1-9个石头(小于箱子的容量). 当轮到某人时,不能再放石子则为输. 问能否找到一种策略使先手必赢. 学习了一下SG函数. 在公平的组合游戏中(游戏规则对于

Nowcoder 挑战赛23 B 游戏 ( NIM博弈、SG函数打表 )

题目链接 题意 : 中文题.点链接 分析 : 前置技能是 SG 函数.NIM博弈变形 每次可取石子是约数的情况下.那么就要打出 SG 函数 才可以去通过异或操作判断一个局面的胜负 打 SG 函数的时候.由于 N 很大 所以不能使用递归的方式打表.会爆栈 还有要预处理每个数的约数 打出 SG 函数之后 暴力判断初始局面的每堆石子取走约数后是否对答案产生贡献 #include<bits/stdc++.h> #define LL long long #define ULL unsigned long

【POJ2425】A Chess Game 博弈,SG函数,裸题,模板题

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42653921 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 题意:给一个有向无环图(拓扑图),有若干个棋子,两人轮流操作,每次可以把其中某棋子沿图走一步,无法操作者输. 题解:SG函数裸题,模板题 代码: #include <cstdio> #include <cstring> #include <iostream> #include <a

【POJ3537】Crosses and Crosses 博弈,SG函数,Multi-SG博弈

转载请注明出处:http://blog.csdn.net/vmurder/article/details/42654067 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 题意:有个一维棋盘,两人轮流下棋,然后谁连成三个谁赢. 题解: 我们考虑到一个长度为n的棋盘,在i处下子,相当于把游戏转化成两个游戏GAME(x-i-2)和GAME(i-3). 原因:左边一部分将不再能下子,右边一部分将不再能下子(准确地说是两个). 然后就成了当前状态俩子状态,然后就是裸SG转移了. Multi

[nim博弈扩展 sg函数] UVALive 3668 A Funny Stone Game

题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=242&page=show_problem&problem=1669 Root :: Regionals 2006 :: Asia - Beijing    Regionals 2006 >> Asia - Beijing 3668 - A Funny Stone Game Tim

hdu 3980 Paint Chain sg函数

题目链接 给一个长度为n的环, 两个人轮流涂色, 每次涂m个连续的, 无法继续涂了就输. 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define pb(x) push_back(x) 4 #define ll long long 5 #define mk(x, y) make_pair(x, y) 6 #define lson l, m, rt<<1 7 #define mem(a) memset(a, 0, sizeo

hdu 1079 Calendar Game sg函数

Calendar Game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2766    Accepted Submission(s): 1594 Problem Description Adam and Eve enter this year’s ACM International Collegiate Programming Con