随笔分类 -  博弈

摘要:博弈(给出牛人的解题思路)先引入必胜点和必败点两个概念: 必败点(P点) :前一个选手(Previous player)将取胜的位置称为必败点。 必胜点(N点) :下一个选手(Next player)将取胜的位置称为必胜点。算法实现: 步骤1:将所有终结位置标记为必败点(P点);(终结位置指的是不能将游戏进行下去的位置) 步骤2:将所有一步操作能进入必败点(P点)的位置标记为必胜点(N点) 步骤3:如果从某个点开始的所有一步操作都只能进入必胜点(N点) ,则将该点标记为必败点(P点) ; 步骤4:如果在步骤3未能找到新的必败(P点),则算法终止;否则,返回到步骤2。解题思路: 由于每次都是从p 阅读全文
posted @ 2012-09-28 21:03 wutaoKeen 阅读(333) 评论(0) 推荐(1)
摘要:这个题要分情况讨论:就是当k>=n时,first一定赢;当k==1时,当k为奇数时,first赢,反则second赢;当k<n&&k!=1一定是second赢,因为每次无论first怎么取,second一定可以使之对称并且是偶数个;那么second一定会赢;View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #incl 阅读全文
posted @ 2012-09-28 19:44 wutaoKeen 阅读(156) 评论(0) 推荐(0)
摘要:我们发现后手是堵不死先手的,如果后手不管先手任他走,那么先手要先一步走到;View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> #include<string> # 阅读全文
posted @ 2012-09-28 17:49 wutaoKeen 阅读(231) 评论(0) 推荐(0)
摘要:Nim博弈题:这个题是要你求如果先手能赢,有几种策略;View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> #include<string> #define LL 阅读全文
posted @ 2012-09-26 19:33 wutaoKeen 阅读(204) 评论(0) 推荐(0)
摘要:一道典型的Nim博弈:View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> #include<string> #define LL long long using 阅读全文
posted @ 2012-09-26 18:50 wutaoKeen 阅读(133) 评论(0) 推荐(0)
摘要:这是一道找规律的题目:我们发现最后的棋子一定会到达1,3,4因为这3个地方是不可能拿到别的地方的:那么我们就只要对一步可以到1||3||4进行Nim计算就可以了,因为任何1个点2步之内就可到1||3||4因此我们就只要考虑j % 6 == 0 || j % 6 == 2 || j % 6 == 5他们的情况:View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<que 阅读全文
posted @ 2012-09-26 18:42 wutaoKeen 阅读(309) 评论(0) 推荐(0)
摘要:取走-分割游戏 这种游戏允许取走某些东西,然后将原来的一个游戏分成若干个相同的游戏。例1、Lasker’sNim游戏:每一轮允许两种操作之一。(1)从一堆石子中取走任意多个(2)将一堆数量不少于2的石子分成都不为空的两堆。分析:很明显,g(0)=0,g(1)=1。 状态2的后继有0,1和(1,1),它们的SG函数值分别是0,1和0,所以g(2)=2。状态3的后继有0,1,2和(1,2),它们的SG函数值分别是0,1,2和3,所以g(3)=4。 状态4的后继有0,1,2,3,(1,3)和(2,2),它们的SG函数值分别是0,1,2,4,5和0,所以g(4)=3。在推一些,我们得到:我们... 阅读全文
posted @ 2012-09-25 19:51 wutaoKeen 阅读(370) 评论(0) 推荐(0)
摘要:这跟巴什博弈是一样的找出区间[1-p]必败[p+1,p+q]必胜(取一个q,就能进入第一个区间)[p+q+1,2*p+q]必败,[2*p+q+1,2*p+2*q]必胜;View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> 阅读全文
posted @ 2012-09-21 20:15 wutaoKeen 阅读(149) 评论(0) 推荐(0)
摘要:这是一道找规律的博弈题,我们只要找到谁拥有主动权,而主动权就是当一个数是另外一个数的2倍以上,这时他就可以掌握全局的胜利;View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> 阅读全文
posted @ 2012-09-21 19:20 wutaoKeen 阅读(243) 评论(0) 推荐(0)
摘要:转载:http://blog.csdn.net/cscj2010/article/details/7760858题目大意是:两个家伙在区域赛前夕闲的无聊,然后玩一种无限纠结的游戏,随即给定一个日期,每次只能移动day OR month..........而且如果下一个月没有当前day的话, 你就不能移动month,比如1月31日,你只能移动day 使其到2月1日,而不能移动月让其到达2月31日,原因你懂的!嗯,现在Adam开始YY了要!需要你来找一个必胜策略!(到达2001.11.4日就不能移动,无法移动的孩纸败必败 必胜11.4 11.311.2 ... 阅读全文
posted @ 2012-09-20 22:14 wutaoKeen 阅读(298) 评论(0) 推荐(0)
摘要:题意:输入由p、q、r、s、t、K、A、N、C、E共10个字母组成的逻辑表达式,其中p、q、r、s、t的值为1(true)或0(false),即逻辑变量;K、A、N、C、E为逻辑运算符,K --> and: x && yA --> or: x || yN --> not : !xC --> implies : (!x)||yE --> equals : x==y问这个逻辑表达式是否为永真式。PS:输入格式保证是合法的这是道题感觉是对计算器进行模拟;解题思路:p, q, r, s, t不同的取值组合共32种情况,枚举不同取值组合代入逻辑表达式WFF进 阅读全文
posted @ 2012-06-29 16:37 wutaoKeen 阅读(171) 评论(0) 推荐(0)
摘要:刚开始这不知道思路,后来还是看了别人的解题报告才弄出来;集体思路:当前的箱子容量为si,那么要赢就要满足t + t*t < si现在箱子本来有ci:ci> t 则必胜;ci == t 则必败;ci < t不能断定输赢,那么就要继续调用SG函数;如果 ci > t SG值就是ci - t;因为剩下的容量只有这么大了;View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include< 阅读全文
posted @ 2012-04-22 21:02 wutaoKeen 阅读(252) 评论(0) 推荐(0)
摘要:这是一道赤裸裸的SG函数的题目;View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 int f[20]={1,1},sg[1024]; 8 void GetFa( ) 9 {10 for( int i = 2 ; i < 20 ; i ++ )11 {12 f[i] = f[i -1] + f[i - 2]; 13 阅读全文
posted @ 2012-04-21 20:15 wutaoKeen 阅读(270) 评论(0) 推荐(0)
摘要:这是一道典型的SG函数题;View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<set> 8 #include<map> 9 #include<vector>10 using namespace std;11 int s[124],sg[10024],n;12 int 阅读全文
posted @ 2012-04-21 16:33 wutaoKeen 阅读(171) 评论(0) 推荐(0)
摘要:只是一道取石子游戏的变形题,刚开始我想着去打表,一直打不出后来画图就一下子清楚了;我们来分析只有一行的情况:我们知道只要黑白棋子之间有空格,只要谁先走就一定谁赢,因为先走者一定会走到与两个棋子之间没有空格的地方,这样才能保证他赢,我们看成取石子且石子只有一堆的情况;那么多行时,我们就可以把两个棋子之间的空格看成有多少个石子,而行可以看成有多少堆,再利用Nim就可以解决问题了;View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm 阅读全文
posted @ 2012-04-20 19:34 wutaoKeen 阅读(292) 评论(0) 推荐(0)
摘要:只是一道Nim题我们可以把他转化成堆就可以了,这个点在哪个地方就相当于这个地点有好多的石子,这样就可以了。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<set> 8 #include<map> 9 #include<vector>10 using namesp 阅读全文
posted @ 2012-04-19 22:25 wutaoKeen 阅读(157) 评论(0) 推荐(0)
摘要:这个题我是打表出来的,达标代码如下:View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<set> 8 #include<map> 9 #include<vector>10 using namespace std;11 int d[3][2] = {0,-1,1,0, 阅读全文
posted @ 2012-04-19 22:04 wutaoKeen 阅读(126) 评论(0) 推荐(0)
摘要:这题我刚开始推出了n=1,2,3的情况,自己在大胆的猜测是奇偶性,发现A了;后来打表也是奇偶性质;打表代码:View Code 1 #include<stdio.h> 2 #include<stdlib.h> 3 int n ; 4 int graph[1010][1010] ; 5 int tab[4][2] = {-1,0,1,0,0,-1,0,1} ; 6 int dfs (int x, int y) 7 { 8 int xx, yy, i, ans ; 9 for (i = 0 ; i < 4 ; i++) 10 { ... 阅读全文
posted @ 2012-04-19 20:40 wutaoKeen 阅读(223) 评论(0) 推荐(0)
摘要:这个题要找一下规律:我们假设1为必败点P,则2~9为必胜点,那么10~18又是必败点,19~162又为必胜点,163~324为必败点;必胜点为m*18^n(m<=9),必败点为m*18^n(m>9);View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<set> 8 #inclu 阅读全文
posted @ 2012-04-18 21:23 wutaoKeen 阅读(159) 评论(0) 推荐(0)
摘要:这题Nim博弈;这一就是要考虑全部为1的情况;View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<set> 8 #include<map> 9 #include<vector>10 using namespace std;11 12 int main( )13 {1 阅读全文
posted @ 2012-04-18 19:31 wutaoKeen 阅读(155) 评论(0) 推荐(0)