取石子游戏与SG函数
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1848
题意:有3堆石子,石子数量分别为a,b,c,有两个玩家,每次只能从任意一堆中取f个,这里的f只能为fibnacci数,问是先手胜
还是先手败.
分析:由于石子的数量都在1000以内,那么我们可以先预处理出1000以内的SG函数值,然后对于3堆石子,我们进行异或,如果为
0说明先手必败,否则必胜,当然求SG函数的值用深搜就行了.
#include <iostream>
#include <string.h>
#include <stdio.h>using namespace std;
const int N = 1005;
const int M = 25;int fib[25];
int SG[N];int mex(int x)
{bool vis[M];memset(vis,0,sizeof(vis));for(int i=0;i<M;i++){int t = x - fib[i];if(t < 0) break;if(SG[t] == -1)SG[t] = mex(t);vis[SG[t]] = 1;}for(int i=0;;i++)if(!vis[i]) return i;
}void Init()
{fib[0] = 1;fib[1] = 2;for(int i=2;i<M;i++)fib[i] = fib[i-1] + fib[i-2];memset(SG,-1,sizeof(SG));for(int i=0;i<N;i++)SG[i] = mex(i);
}int main()
{Init();int a,b,c;while(~scanf("%d%d%d",&a,&b,&c)){if(a == 0 && b == 0 && c == 0) break;int ans = 0;ans ^= SG[a];ans ^= SG[b];ans ^= SG[c];if(ans) puts("Fibo");else puts("Nacci");}return 0;
}
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1536
分析:本题基本上跟上体一样,只是把3堆改为x堆,把取fibnacci数列颗石子改为取指定输入的石子个数.那么做法实际上一
样,我们对输入的序列进行排序,然后求出它们的SG函数的值,然后直接用即可.
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>using namespace std;
const int N = 10005;
const int M = 105;int a[M];
int SG[N];
int n;int mex(int x)
{bool vis[M];memset(vis,0,sizeof(vis));for(int i=0;i<n;i++){int t = x - a[i];if(t < 0) break;if(SG[t] == -1)SG[t] = mex(t);vis[SG[t]] = 1;}for(int i=0;;i++)if(!vis[i]) return i;
}int main()
{while(~scanf("%d",&n)){if(n == 0) break;for(int i=0;i<n;i++)scanf("%d",&a[i]);sort(a,a+n);memset(SG,-1,sizeof(SG));for(int i=0;i<N;i++)SG[i] = mex(i);int m;scanf("%d",&m);while(m--){int ans = 0;int len,t;scanf("%d",&len);for(int i=0;i<len;i++){scanf("%d",&t);ans ^= SG[t];}if(ans) printf("W");else printf("L");}puts("");}return 0;
}
取石子游戏与SG函数相关推荐
- 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛B 取石子(博弈SG函数模板)
题目链接:取石子 链接:https://www.nowcoder.com/acm/contest/122/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65 ...
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)
Time Limit: 5 Sec Memory Limit: 162 MB Submit: 871 Solved: 365 [Submit][Status][Discuss] Descripti ...
- bzoj1874: [BeiJing2009 WinterCamp]取石子游戏
1874: [BeiJing2009 WinterCamp]取石子游戏 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 834 Solved: 350 ...
- 4005. 取石子游戏
Powered by:NEFU AB-IN Link 文章目录 4005. 取石子游戏 题意 思路 代码 4005. 取石子游戏 题意 Alice 和 Bob 正在玩一个取石子游戏. 共有 n个石子, ...
- 51nod3431 取石子游戏
3431 取石子游戏 小H和小Z正在玩一个取石子游戏. 取石子游戏的规则是这样的,每个人每次可以从一堆石子中取出若干个石子,每次取石子的个数有限制,谁不能取石子时就会输掉游戏. 小H先进行操作,他想问 ...
- Nim 游戏和 SG 函数
Nim游戏 Nim游戏定义 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于"Impartial Combinatorial Games"(以下 ...
- 【acm 博弈论 】 之 Nim游戏与sg函数
文章目录 前言 巴什博弈 威佐夫博弈 Nim游戏 Nim游戏与sg函数 题目 题意 样例 思路 代码 前言 从今天开始复习和整理下acm的部分模块,从博弈论开始. 著名的"取石子" ...
- 【学习笔记】NIM游戏与SG函数初探
公平组合游戏ICG 游戏条件介绍: 由两名玩家交替行动 游戏进程的任意时刻,可以执行的合法行动与轮到的玩家无关 若当前玩家无法行动,则判负 则称该组合游戏为公平组合游戏.如NIM游戏等即是经典的公平组 ...
- 博弈论之取石子游戏的学习
以下内容来自转载: 博弈问题简介 所讨论的博弈问题满足以下条件: 玩家只有两个人,轮流做出决策 游戏的状态集有限,保证游戏在有限步后结束,这样必然会产生不能操作者,其输 对任何一种局面,胜负只决定于局 ...
最新文章
- 在vs2008中配置OpenCV2.2
- go channel 缓冲区最大限制_GO语言圣经学习笔记(八)Goroutines和Channels
- Linux性能监控和调试
- 代码审计之Catfish CMS v4.5.7后台作者权限越权两枚+存储型XSS一枚
- 数据库-优化-数据库系统配置优化-操作系统优化
- mac 没有所有开发者_为什么开发人员应该像产品所有者那样思考
- java list遍历添加元素_java遍历List过程中添加和删除元素的问题
- git-ssh 配置和使用
- 数组求最大公约数c语言,C语言辗转相除法求2个数的最小公约数
- Java基础学习总结(73)——Java最新面试题汇总
- HDU 3416 Marriage Match IV
- 334个地级市名单_中国各级行政区划数量,统计到乡镇一级
- 页面字体颜色的设置及常用颜色的RGB值
- win10 1050ti anaconda搭建tensorflow-gpu
- Oracle数据库如何保存中文特殊字符到数据库表中,防止出现问号
- 分群思维(六)分群思维的顶层应用-用户画像
- mysql 8安装方法_Mysql8.0.17安装教程【推荐】
- uniapp 在h5 模式下扫码
- 网络爬虫学习第二弹:requests库的使用
- 搭建社群积分系统,使用这个工具足以