随笔分类 -  博弈

摘要:典型的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 namespace std;11 12 int main( )13 {14 int num[124] 阅读全文
posted @ 2012-04-18 17:05 wutaoKeen 阅读(111) 评论(0) 推荐(0)
摘要:这是一道Fibonacci’s Game (斐波那契博弈)斐波那契博弈模型,是ACM题中常见的组合游戏中的一种,大致上是这样的:有一堆个数为 n 的石子,游戏双方轮流取石子,满足:1. 先手不能在第一次把所有的石子取完;2. 之后每次可以取的石子数介于 1 到对手刚取的石子数的 2 倍之间(包含 1 和对手刚取的石子数的 2 倍)。约定取走最后一个石子的人为赢家,求必败态。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm& 阅读全文
posted @ 2012-04-18 16:05 wutaoKeen 阅读(200) 评论(0) 推荐(0)
摘要:这是一道Nim博弈;这要要考虑就是全是1的情况;View Code 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 int main( ) 8 { 9 int n,m,num;10 while( scanf( "%d",&n )==1 )11 {12 while( n-- )13 {14 scanf( &quo 阅读全文
posted @ 2012-04-18 00:11 wutaoKeen 阅读(216) 评论(0) 推荐(0)
摘要:这也是一道巴什博弈;这题如果你是先手,考虑你的必胜态。注意,因为任何正整数都能写成若干个2的整数次方幂之和。由于规定只能取2的某个整数次方幂,只要你留给对手的牌数为3的倍数时,那么你就必赢,因为留下3的倍数时,对手有两种情况:1:如果轮到对方抓牌时只剩3张牌,对方要么取1张,要么取2张,剩下的你全取走,win! 2:如果轮到对方抓牌时还剩3*k张牌,对手不管取多少,剩下的牌数是3*x+1或者3*x+2。轮到你时,你又可以构造一个3的倍数。 所以无论哪种情况,当你留给对手为3*k的时候,你是必胜的。题目说Kiki先抓牌,那么当牌数为3的倍数时,Kiki就输了。否则Kiki就能利用先手优势将留给对 阅读全文
posted @ 2012-04-17 23:40 wutaoKeen 阅读(635) 评论(0) 推荐(0)
摘要:View Code 1 #include<stdio.h> 2 int main( ) 3 { 4 int Case , n , m; 5 scanf("%d" ,&Case ); 6 while( Case-- ) 7 { 8 scanf( "%d%d",&n,&m ); 9 if( n%( m + 1 )==0 )10 puts( "second" );11 else puts( "first" );12 } 13 return 0; 14 }这是一道简单的巴什博弈;所谓巴什 阅读全文
posted @ 2012-04-17 23:25 wutaoKeen 阅读(282) 评论(0) 推荐(0)
摘要:只是一道NIM(尼姆博弈)题;尼姆博弈模型,是ACM题中常见的组合游戏中的一种,大致上是这样的:有3堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取1个,多者不限,最后取光者得胜这种情况最有意思,它与二进制有密切关系,我们用(a,b,c)表示某种局势,首先(0,0,0)显然是必败态,无论谁面对(0,0,0) ,都必然失败;第二种必败态是(0,n,n),自己在某一堆拿走k(k ≤ n)个物品,不论k为多少,对方只要在另一堆拿走k个物品,最后自己都将面临(0,0,0)的局势,必败。仔细分析一下,(1,2,3)也是必败态,无论自己如何拿,接下来对手都可以把局势变为(0,n,n)的情形 阅读全文
posted @ 2012-04-16 21:47 wutaoKeen 阅读(874) 评论(0) 推荐(0)
摘要:这题就是对http://acm.hdu.edu.cn/showproblem.php?pid=1527的扩充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 names 阅读全文
posted @ 2012-04-16 20:49 wutaoKeen 阅读(250) 评论(0) 推荐(0)
摘要:只是我第一道博弈题,这个是威佐夫博弈所谓威佐夫博弈,是ACM题中常见的组合游戏中的一种,大致上是这样的:有两堆石子,不妨先认为一堆有 10,另一堆有 15 个,双方轮流取走一些石子,合法的取法有如下两种:1、在一堆石子中取走任意多颗;2、在两堆石子中取走相同多的任意颗;约定取走最后一颗石子的人为赢家,求必胜策略。两堆石头地位是一样的,我们用余下的石子数(a,b)来表示状态,并画在平面直角坐标系上。和前面类似,(0,0)肯定是 P 态,又叫必败态。(0,k),(k,0),(k,k)系列的节点肯定不是 P 态,而是必胜态,你面对这样的局面一定会胜,只要按照规则取一次就可以了。再看 y = x 上方 阅读全文
posted @ 2012-04-16 20:46 wutaoKeen 阅读(882) 评论(3) 推荐(0)