博弈
文章平均质量分 58
Sleppypot
困难的路越走越容易,容易的路越走越难。
展开
-
求sg值——分析与找规律
题目:hdu1517题意:你和一个人玩游戏,给你一个数字n,每次操作可以从2~9中任选一个数字,并把它与p相乘,(游戏开始时p=1)两人轮流操作,当一个人操作完后p>=n,这个人就是胜者。解答:方法一:写个求sg值的函数,然后找规律。 方法二:首先,有以下结论:1.任意操作都可将奇异局势变为非奇异局势。(必败状态转换为必胜状态)原创 2016-08-27 17:08:48 · 990 阅读 · 0 评论 -
nim游戏求先手第一步走的方法
题目:hdu1850题意:nim游戏求先手第一步走的方法解决:先处理出所有数抑或的值。然后再跟每个数分别抑或(抑或了两遍相当于没有抑或)。如果得出来的值比这个数小。就可以#include#include#include#includeusing namespace std;const int MAXN = 110;int a[MAXN];int n;int main()原创 2016-08-26 20:50:54 · 841 阅读 · 0 评论 -
求sg函数值
题目:hdu1536题意:nim游戏。但是每次拿的数目有限制。解答:dfs求sg值注意:dfs的时候vis数组要重新定义!!!!!#include#include#include#includeusing namespace std;const int MAXN = 10010;const int maxn = 110;int n,m,k,t;int a[maxn]原创 2016-08-26 20:28:20 · 577 阅读 · 0 评论 -
求sg值以及找规律
题目:hdu1079题意:随机给一个日期,两个人轮流计数,可以将月份加一,也可以将日期加一,但是要符合日期的客观规律(即要考虑平年闰年和日期进位下的进位情况),如果是2001年1月31日则日期+1后变成 2001年2月1日,因为2月没有31天故不可以将月份加一。先到达2001.11.4的获胜。解答:方法一:求sg值。#include#include#include#include原创 2016-08-27 22:05:22 · 768 阅读 · 0 评论 -
威佐夫博弈基础2
题目:hdu2177题意:有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。如果你胜,你第1次怎样取子? 解答:如果满足必败态,输出0。否则。首先原创 2016-08-25 21:03:36 · 337 阅读 · 0 评论 -
巴什博弈基础2
题目:hdu2149题意:普通巴什博弈。问第一个人要保证自己能赢第一次应该拿多少个,必败则输出none.解答:如果n%(m+1)=0的话必败,如果n >= m,就输出m到n就行。如果不必败。那么第一次那的数目应该等于n%(m+1).为了让对手处于必败态。#include#includeusing namespace std;int main(){ int m,n;原创 2016-08-25 17:57:10 · 230 阅读 · 0 评论 -
巴什博弈基础
题目:hdu2188题意:两人轮流捐款,每个人最少捐1元最多捐m元。谁先捐到n元谁赢。解答:如果n%(m+1)为0,则后手赢,否则先手赢。#include#includeusing namespace std;int main(){ int T,n,m; scanf("%d",&T); while(T--) { int ok =原创 2016-08-25 17:21:18 · 254 阅读 · 0 评论 -
博弈总结
1.巴什博弈:一堆石子,每人一次从一堆石子(n个)中拿走1到m个,谁先拿光谁赢。 结论:如果石子数n模(m+1)是0.那么是奇异局势(先手必败),否则先手必胜。 另外:如果先拿光的那个人输的话,那么(n-1)%(m+1)为奇异局势。2.威佐夫博弈:两堆石子,每人每次从任意一堆中拿任意个或者同时从两堆石子原创 2016-08-31 19:16:27 · 275 阅读 · 0 评论 -
带环的博弈and对称性
题目:hdu3951题意:有一圈硬币有n个。每个人每次可以拿连续的1到k个。谁先拿完谁赢。解答:n k =1:看奇偶 其他情况:!!!!!第一个拿完之后就变成了一条链。这时候第二个人把这条链分为相同长度的两个部分。然后先手拿啥他就对应的拿啥。 因为:sg值一样的两个游戏处于必败状原创 2016-08-28 20:37:05 · 431 阅读 · 0 评论 -
博弈综合
题目:hdu5754题意:有4种操作分别是:1.king.每次横或者竖或者斜只能走一步2.rook(castle).每次横或者竖能走若干步3.knight.每步先横(竖)走一格,再斜走一格。或者每步先斜走一格,再横(竖)走一格4.queen.每次横或竖或斜走若干步然后这些操作对应的是国际象棋里面的一些操作(具体操作可以百度) 然后现在我们站在(1,1)点,要去往(N,M)点原创 2016-08-30 21:38:51 · 410 阅读 · 0 评论 -
威佐夫博弈基础
题目:poj1067题意:游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。先手胜输出1,先手负输出0.解答:有一个神奇的公式。ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,...n 方括号表示取整函数)。在判断是否满足的时候,算出ak与bk的差值原创 2016-08-25 19:22:54 · 313 阅读 · 0 评论 -
状态压缩与求sg函数
题目:hdu5724题意:给定一个n*20的棋盘,棋盘上有若干棋子。如果一颗棋子右侧为空,则只可以向右移动一格,若非空,则可以移到第一个空的位置,两人轮流操作,不能操作者为输,问先者是否有必胜策略。解答:注意到棋盘只有20列,则可以用状态压缩存储当前的状态。预处理出所有状态的sg值。然后n个抑或一下就好了。我的代码(每次递归求出当前的sg值):#include#include#原创 2016-08-28 19:46:21 · 411 阅读 · 0 评论 -
带一个圆环的尼姆博弈
题目:hdu3980题意:有一串含有n个珠子的链子。每个人每次只能给相邻的m个珠子涂色。谁先不能涂了谁就输了。解答:重点:第一个人涂完之后它就变成了一条直线。然后每次在直线中选m个连续的涂完剩下两条抑或一下就行。#include#include#include#include#includeusing namespace std;const int MAXN = 1010;原创 2016-08-28 15:06:09 · 491 阅读 · 0 评论 -
斐波那契博弈
题目:hdu2516题意:有一堆个数为 n 的石子,游戏双方轮流取石子,满足:1. 先手不能在第一次把所有的石子取完;2. 之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。约定取走最后一个石子的人为赢家,求必败态。解答:如果n为斐波那契数则先手必败,否则先手必胜。#include#include#include#includ原创 2016-08-28 13:29:12 · 655 阅读 · 0 评论 -
Nim游戏、斐波那契数列和求sg值
题目:hdu1848题意:Nim游戏。每次只能拿斐波那契数列中的数。解答:dfs求sg函数值#include#include#include#include#includeusing namespace std;const int MAXN = 1100;int a[MAXN],sg[MAXN];int m,n,q;void init(){ a[0] = 1原创 2016-08-26 21:12:14 · 517 阅读 · 0 评论