随笔分类 -  博弈论

摘要:Moore’s NimkNim游戏的简单扩展,不过证明我还是想了一些时间的。n堆石子,每次从不超过k堆中取任意多个石子,最后不能取的人算失败。把n堆石子的石子数用二进制表示,统计每一二进制位上的1的个数,若每一位上1的个数mod (k + 1)全为0,则必败。否则必胜证明:1.显然终止局面全为0满足命题,为必败态2.对于某个局面,若存在某些二进制位上的1的个数mod (k + 1)不为0,则一定存在一个合法的移动,使得每一个二进制位上的1的个数mod(k + 1)等于0。设1的个数mod(k + 1)不为0的最高二进制位上有m个1,则把这些1都变成0,记此时改变的堆数为m,若遇到下一个1的个数 阅读全文
posted @ 2013-06-01 20:07 AC_Von 阅读(869) 评论(0) 推荐(0) 编辑
摘要:开始还以为是简单博弈,后来发现是楼教主的男人八题里面的,好吧。我想不到怎么构造最优解。。。http://blog.csdn.net/niushuai666/article/details/6639977这里讲的很详细,总结起来就是:当一堆时,必胜,两堆相同时,必败,三堆时,可以一次转化成为两堆,所以必胜。故:a1,a2,a3…………an为必败点<=>当n为偶数时,对a1--an进行从小到大或从大到小排序,如果有a1=a2,a3=a4,…………an-1=an,必败当n为奇数时以及其它的情况则必胜 阅读全文
posted @ 2013-04-30 11:45 AC_Von 阅读(361) 评论(0) 推荐(0) 编辑
摘要:题意:一个有向无环图,制定M个点,每个点有一个石子。A,B两个玩家轮流移动这些石子(石子只能沿合法的边移动),最后没有石子可移的算输。如果光看一个石子的话,这他妹的就是sg函数的定义啊。。。然后对整个图处理一下每个点的sg值。对这M个点怎么处理,这么想吧。假设其中一个点为i,其sg值为sg[i] = a (a != 0)那可以发现,i可以走向[0, a-1]的任意sg值,这相当与什么?相当与这里有一堆石子,共a个。。。。M个点就是M堆石子,每堆石子的个数就是这个点的sg值。好吧Nim博弈出来了。。。ps:有谁能把抑或傻逼的写成与,有谁能把标记数组写成全局变量???我能!脑子进屎了!#inclu 阅读全文
posted @ 2013-04-28 16:03 AC_Von 阅读(1051) 评论(0) 推荐(0) 编辑
摘要:From:http://hi.baidu.com/lydrainbowcat/item/f16e64103f8c5c088fbde44cPOJ【数论/组合/博弈论】题目列表原来的列表比较水,今天换了一个难一些的列表,重新开始做~红色的代表已经AC过,蓝色的代表做了但是还没过。这句话貌似在我空间里的每份列表里都有额。博弈论POJ 2234 Matches GamePOJ 2975 NimPOJ 2505 A multiplication gamePOJ 1067 取石子游戏 威佐夫博弈,奇异局势(必败局)为ak = [k*(1 + sqrt(5))/2], bk = ak + k;POJ 24. 阅读全文
posted @ 2013-03-10 19:49 AC_Von 阅读(3282) 评论(1) 推荐(1) 编辑
摘要:《对弈程序基本技术》专题 最小-最大搜索:http://www.xqbase.com/computer/search_minimax.htm《对弈程序基本技术》专题 Alpha-Beta搜索 :http://www.xqbase.com/computer/search_alphabeta.htmWikipedia MinMax :http://en.wikipedia.org/wiki/MinimaxWiki Alpha–beta pruning :http://en.wikipedia.org/wiki/Alpha%E2%80%93beta_pruningMinmax Explained:h 阅读全文
posted @ 2013-01-25 19:19 AC_Von 阅读(3934) 评论(0) 推荐(2) 编辑
摘要:用dfs搜索每种情况所对应的sg值(这里也就是对应的是N位还是P位),若下一步为P位,则当前一步为N位。。。代码:#include <iostream>#include <cstdio>using namespace std;const int N = 55;char map[N][N];int m, n;int judge(int i, int j){ if(map[i][j] == '0' && map[i][j+1] == '0' && map[i+1][j] == '0' & 阅读全文
posted @ 2011-10-12 13:17 AC_Von 阅读(348) 评论(0) 推荐(0) 编辑
摘要:/*今天一翻以前做的sg函数的题,这题原来的代码居然跑781MS, 我晕!又重新写了一遍,开始vis数组定义成全局变量了,WA。。。T_TMy Code(78+MS):*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 1005;struct node{ int num; int edg[N];}e[N];int sg[N];int mex(int t){ if(sg[t] != -1) return sg[t]; int i; . 阅读全文
posted @ 2011-10-11 17:32 AC_Von 阅读(210) 评论(0) 推荐(0) 编辑
摘要:威佐夫博弈公式:当处在奇异局势时,ak = (k*(1 + sqrt(5))/2), bk = ak + k;所以,这题套公式即可:My Code:#include <iostream>#include <cstdio>#include <cmath>using namespace std;int main(){ int n, m, k, tmp; while(~scanf("%d%d", &n, &m)){ if(m > n){ n = n + m; m = n - m; n = n - m; ... 阅读全文
posted @ 2011-09-28 15:26 AC_Von 阅读(230) 评论(0) 推荐(0) 编辑
摘要:/*做完后看到网上很多人推的规律,还有巴什博弈。表示还没有学习巴什博弈,直接用sg写的,这题可以说是sg函数的简化版。最后只需判断sg[n]是否为0即可。回家看巴什博弈去,T_T...(看到队里很多人都是0MS过的,不得不佩服啊,估计网上流传的代码这题用sg写的我这是独此一家了,就是时间有点烂。呵呵,不过这题作为sg函数的入门题还是不错的)*//*My Code 109+ms */#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 10 阅读全文
posted @ 2011-09-28 11:18 AC_Von 阅读(253) 评论(0) 推荐(0) 编辑
摘要:拿到这题的第一个感觉就是跟Nim博弈正好反过来了,然后就不知道怎么做了,后来问大牛,大牛的回答很简练:“anit-nim,国家集训队论文”。然后我就翻了一晚上论文。表示又学到新知识了,呵呵。My Code:#include <iostream>#include <cstdio>using namespace std;int a[50];int main(){ //freopen("data.in", "r", stdin); int t, n, i, flag; while(scanf("%d", &t 阅读全文
posted @ 2011-09-27 22:04 AC_Von 阅读(538) 评论(0) 推荐(0) 编辑
摘要:这题问了三个人才做出来,晕啊。第一位是位大牛,把基本的思路给我讲清楚了,但是在实现上卡住了,老是想着怎么开个sg[]数组记忆搜过的sg值,后来才发现想错了。第二位,之前被大牛讲明白的gbx,原来这里直接返回s - c的值当作sg值就行,至于为什么,稍后再续。第三位,zz,可以鄙视我了,因为我手贱看他的代码了,不过他的代码确实有值得学习的地方,很简练!思路:这题明显的sg函数。可惜我纠结了半天没想起思路来。1、设当前的箱子容量为si,求出一个t满足:t + t * t < si,如果当前箱子里有ci颗石头,1、ci > t 则必胜;2、ci == t 则必败;3、ci < t不 阅读全文
posted @ 2011-09-27 17:34 AC_Von 阅读(1140) 评论(1) 推荐(0) 编辑
摘要:找规律的题目,规律如下:2 —— 9 N-position10 —— 9*2 P-position19 —— 9*2*9 N9*2*9+1 —— 9*2*9*2 P9*2*9*2+1 —— 9*2*9*2*9 N。。。思路:将输入的数连除18,当得到的数n小于18时,判断如果(2 <= n <=9)则为N位,否则为P位;My Code:#include <iostream>#include <cstdio>#include <cstring>using namespace std;int main(){ //freopen("data. 阅读全文
posted @ 2011-09-25 19:24 AC_Von 阅读(186) 评论(0) 推荐(0) 编辑
摘要:类似 Fibonacci again and again貌似有点模板的感觉,就是不知到hash数组的上界是怎么算出来的,无语,继续研究去。。。#include <iostream>#include <cstdio>using namespace std;const int N = 10010;const int M = 110;int num[M];int vis[N];int sg[N];int n;void get_sg(){ int i, j; for(i = 0; i < N; i++) sg[i] = 0; for(i = 1; i < N; i+ 阅读全文
posted @ 2011-09-24 20:54 AC_Von 阅读(259) 评论(0) 推荐(0) 编辑
摘要:sg函数,有人说这是解决博弈论问题的王道,不过现在我还没感觉,只是知道像这道题类型的题目用sg函数解。至于什么是sg函数。。。 先定义mex运算,mex是对集合的运算,它表示最小不属于该集合的非负整数。比如 mex {0} = 1; mex{0, 2} = 1;mex{1, 2, 3} = 0;sg(x) = mex{...};这里是三堆,求得每堆的sg值,然后抑或运算,结果为0则为P-position,否则为N-position。 至于怎么证明的,网上资料很多:sg函数入门:http://hi.baidu.com/%BA%A3%CF%E0%C1%AC/blog/item/ac7a411... 阅读全文
posted @ 2011-09-24 12:18 AC_Von 阅读(1022) 评论(0) 推荐(0) 编辑
摘要:最近搞了一下博弈论,处于初级入门阶段,找了几个题做做,正巧碰上这题。这题是Nim博弈的一个变形,将两坐标的距离看作一堆石子中的石子数,n就是石子堆数,所以根据Nim博弈的结论:a1 ^ a2 ^ a3……^an == 0 ,则必胜。所以这题的答案就出来了。My Code:#include <iostream>#include <cstdio>using namespace std;int main(){//freopen("data.in", "r", stdin);int a, b, ans, tmp;int n, m;whil 阅读全文
posted @ 2011-09-22 21:58 AC_Von 阅读(315) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示