Ferguson游戏&&Ua12293——打表找规律
题意
有两个盒子分别有m颗糖果和n颗糖果,每次移动是将一个盒子清空而把另一个盒子里得一些糖果拿到被清空的盒子,使得两个盒子至少各有一个。无法移动者输。
分析
设初始状态为(m, n),显然(1, 1)是终态。
其实对于一个状态,只与两者之和有关。按k=m+n从小到大排序,就能递推的求出每个状态是必胜还是必败。
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn = + ;
bool win[maxn][maxn]; void solve()
{
win[][] = false;
for(int k = ;k < ;k++)
{
for(int n = ;n < k;n++)
{
int m = k - n;
win[n][m] = false;
for(int i = ;i < n;i++)
if(!win[i][n-i]) win[n][m] = true;
for(int i = ;i < m;i++)
if(!win[i][m-i]) win[n][m] = true;
//if(n <= m && win[n][m]) printf("%d %d\n", n, m);
}
}
} int main()
{
solve();
for(int i = ;i < ;i++)
for(int j = i;j <;j++)
if(win[i][j]) printf("%d %d\n", i, j);
}
发现规律:m,n都为奇数时先手必败;否则先手必胜。
Uva12293
题意:与Ferguson类似,不同的是,初始时两个盒子分别是(n, 1),每次选择数目较小的一个清空,并重新分配是的每个盒子中至少有一个。最先无法分配者输。
分析:
在上面的打表程序上稍做修改,
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn = + ;
bool win[maxn][maxn]; void solve()
{
win[][] = false;
for(int k = ;k <= ;k++)
{
for(int n = ;n <= k/;n++)
{
int m = k - n;
win[n][m] = win[m][n] = false;
for(int i = ;i < m;i++)
if(!win[i][m-i]) win[n][m] = win[m][n] = true;
}
}
} int main()
{
solve();
for(int i = ;i <;i++)
if(!win[i][]) printf("%d %d\n", , i);
}
必败态如下:

规律:(n+1)是2的整数次幂时是必败态,否则为必胜态。
判断(n+1)为2的整数次幂的方法:n&(n+1)=0.
参考链接:
1. https://blog.csdn.net/TSY_1222/article/details/83277648
2. https://blog.csdn.net/acdreamers/article/details/17020495
Ferguson游戏&&Ua12293——打表找规律的更多相关文章
- vijos 1004 伊甸园日历游戏 博弈+打表找规律
描述 Adam和Eve玩一个游戏,他们先从1900.1.1到2001.11.4这个日期之间随意抽取一个日期出来.然后他们轮流对这个日期进行操作: 1 : 把日期的天数加1,例如1900.1.1变到19 ...
- hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)
Nim or not Nim? Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Sub ...
- HDU 5753 Permutation Bo (推导 or 打表找规律)
Permutation Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...
- HDU 4861 Couple doubi (数论 or 打表找规律)
Couple doubi 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/D Description DouBiXp has a ...
- HDU2149-Good Luck in CET-4 Everybody!(博弈,打表找规律)
Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- 【ZOJ】3785 What day is that day? ——浅谈KMP在ACM竞赛中的暴力打表找规律中的应用
转载请声明出处:http://www.cnblogs.com/kevince/p/3887827.html ——By Kevince 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这 ...
- HDU 5795 A Simple Nim(SG打表找规律)
SG打表找规律 HDU 5795 题目连接 #include<iostream> #include<cstdio> #include<cmath> #include ...
- hdu_5894_hannnnah_j’s Biological Test(打表找规律)
题目链接:hdu_5894_hannnnah_j’s Biological Test 题意: 有n个不同的位置围成一个圈,现在要安排m个人坐,每个人至少的间隔为k,问有多少种安排 题解: 先打表找规律 ...
- hdu_5795_A Simple Nim(打表找规律的博弈)
题目链接:hdu_5795_A Simple Nim 题意: 有N堆石子,你可以取每堆的1-m个,也可以将这堆石子分成3堆,问你先手输还是赢 题解: 打表找规律可得: sg[0]=0 当x=8k+7时 ...
随机推荐
- Disable foreign key checks during import
The command SET FOREIGN_KEY_CHECKS=0; sets the value of a variable in a session scope. So it affects ...
- 模板方法(TemplateMethod)模式
模板方法模式是准备一个抽象类,将部分逻辑以具体方法以及构造子的形式出现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑部分有不同的实现.这也 ...
- 在ASP.NET Core中获取客户端和服务器端的IP地址(转载)
随着ASP.NET的发展,有不同的方式从请求中访问客户端IP地址.WebForms和MVC Web应用程序只是访问当前HTTP上下文的请求. var ip = HttpContext.Current. ...
- Django中一些常用的文档段落
1. Settings¶ STATIC_URL¶ MEDIA_ROOT¶ MEDIA_URL¶ AUTH_USER_MODEL¶ USE_I18N¶ USE_L10N¶ USE_TZ¶ (三者默 ...
- JS获取当前时间戳及时间戳的转换
获取现在的Unix时间戳(Unix timestamp) Math.round(new Date().getTime()/1000) //getTime()返回数值的单位是毫秒 Unix时间戳(Un ...
- Ubuntu 使用scrapy-splash
配置docker 1.更新apt索引: $ sudo apt-get update 2.安装包允许apt通过HTTPS使用仓库: sudo dpkg --configure -a sudo apt ...
- mmap vs read
先放个结论: 内存映射通常比随机访问更快,尤其访问的对象是分离的和不可预测的. 内存映射会持续占用pages, 直到完成访问. 这意味当长时间重度使用一个文件很久之前, 然后你关闭了它, 然后再重新打 ...
- MYSQL中的时间类型
时间上总共有五中表示方法:它们分别是 time.date.datetime.timestamp和year. time : “hh:mm:ss”格式表示的时间值,格式显示TIME值,但允许使用字符串或 ...
- Samba + DLAN 实现电视机播放电脑文件
用SMB功能——简单二步让电视访问电脑文件http://tieba.baidu.com/p/5330683066 DLNA怎么用?简单三步实现电脑电视DLNA互联!https://news.znds. ...
- centos7快速安装coreDns
1.下载二进制文件 wget https://github.com/coredns/coredns/releases/download/v1.5.0/coredns_1.5.0_linux_amd64 ...