博弈——Nim&SG函数函数(hdu1848)
来源:互联网 发布:mac mini是什么 编辑:程序博客网 时间:2024/06/14 04:01
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1848
*如对Nim博弈不是很理解的请移步上篇博客http://blog.csdn.net/sm9sun/article/details/53229631
题目描述:
Fibonacci取石子
1、 这是一个二人游戏;
2、 一共有3堆石子,数量分别是m, n, p个;
3、 两人轮流走;
4、 每走一步可以选择任意一堆石子,然后取走f个;
5、 f只能是菲波那契数列中的元素(即每次只能取1,2,3,5,8…等数量);
6、 最先取光所有石子的人为胜者;
也就是说在Nim博弈的基础上,对取石子的个数加以限制。这里我们引入一个SG函数的概念
SG函数的百科说明:给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移动者判负。
看起来有点抽象。实际上的意思就是 假如一个x,其f(x)=k,那么x的下一步操作,就是后继 可以满足0<=f(x->next)<k,当然其后继不可能等于k。
这就等同于Nim博弈里把k个石子变成0,1……k-1是一个道理
所以将这n枚棋子所在的顶点的SG值看作其n堆相应数量的石子,那么这个Nim游戏的每个必胜策略都对应于原来这n枚棋子的必胜策略
即又回到了Nim博弈
#include<stdio.h>int f[16]={1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597};//懒的写fib函数了= =!!! int SG[1005]={0}; int E[1005];void f_sg(){ int i,j; int h[20]; E[0]=0;E[1]=1; for(i=2;i<=1000;i++) { for(j=0;j<=15;j++) { h[j]=0; } for(j=0;f[j]<=i;j++) //SG值状态标记 { h[E[i-f[j]]]=1; } for(j=0;j<=15;j++) if(h[j]==0) //最小SG值 { E[i]=j; break; } }}int main(){ int m,n,p,x;f_sg();while(~scanf("%d%d%d",&m,&n,&p),(m||n||p)){x=E[m]^E[n]^E[p];if(x)printf("Fibo\n");elseprintf("Nacci\n");}return 0;}
题目描述:先抛一个取石子问题:
1 0
- 博弈——Nim&SG函数函数(hdu1848)
- hdu1848(博弈SG函数初应用)
- 博弈(SG函数讲解及其应用)(hdu1848)
- hdu1848——Fibonacci again and again(SG函数)
- 博弈学习(一) NIM + SG函数
- [POJ2960]S-Nim(博弈SG函数)
- 【Nim博弈与SG函数】
- Nim博弈与SG函数
- 博弈之——SG模板(hdu1848&&hdu1536)
- HDU 1536 S-Nim (博弈 sg函数 Nim和)
- SG函数(HDU1848)
- hdu1848 Fibonacci again and again(SG函数博弈)
- hdu 1536、hdu 1944 S-Nim(博弈SG函数)
- 博弈论之Nim博弈与sg函数(一)
- 博弈论之Nim博弈与sg函数(二)
- 【HDU1536】S-Nim (博弈,SG函数)
- HDOJ 1536 S-Nim 博弈 SG函数
- POJ2960 S-Nim SG函数博弈
- Java 继承Thread和实现Runnable实现多线程的区别
- 三次样条曲线拟合
- AndrWebView的详解(js和Android互调)笔记
- 后台JSON与JAVA数据的转换
- 基于laravel 的antvel 迁移数据出错
- 博弈——Nim&SG函数函数(hdu1848)
- Objective C 学习
- sql中AUTO INCREMENT 字段
- JDBC query table definition
- 漫画告诉你什么是DDoS攻击?
- kafka-node
- OPENCV HS算法源码
- HDU1274 Hat’s Words(字典树 数组实现)
- 图像缩放双立方插值