博弈论
徐州牧
这个作者很懒,什么都没留下…
展开
-
poj解题报告——2975
题意:求出所给的游戏状态有多少种方法能够赢。其实就是算最后有多少种满足t^a[i]#includeusing namespace std;int a[1002];int main(){ int n,i; while(scanf("%d",&n)&&n) { int t=0; for(i=1;i<=n;i++) { scanf("%d",&a[i]);原创 2015-08-10 14:14:27 · 366 阅读 · 0 评论 -
poj解题报告——3533
题意:每个点上有灯,每次选择 (x1,y1,z1), (x1,y1,z2), (x1,y2,z1), (x1,y2,z2), (x2,y1,z1), (x2,y1,z2), (x2,y2,z1), (x2,y2,z2)(1 ≤ x1 ≤ x2 ≤ 1000, 1 ≤y1 ≤ y2 ≤ 1000, 1 ≤z1 ≤ z2 ≤ 1000 )点进行等状态的转换,但要求(x2,y2,z2)必须是有开着的状态原创 2015-08-19 11:53:14 · 662 阅读 · 0 评论 -
poj解题报告——2348
题意:给定两个数,两个人轮流操作,先把其中一个数变为0的人赢。这种操作是用把大数变为大数减小数的若干倍的差(不能小于0)。问谁能赢。分析:谁先抢到关键态,谁就能赢。关键态就是大数是小数的二倍多。一个人一旦抢到了关键态,就可以直接操控下面一连串的非关键态的次序,非关键态相当于每个人进行的都是a%b,所以是交替进行a%b和b%a。也就是说这个究竟自己是a%b还是b%a在非关键态中,自己是无法决定的原创 2015-08-06 10:07:54 · 882 阅读 · 0 评论 -
poj解题报告——3710
题目大意:有N 个局部联通的图。Harry 和Sally 轮流从图中删边,删去一条边后,不与根节点相连的部分将被移走。Sally 为先手。图是通过从基础树中加一些边得到的。所有形成的环保证不共用边,且只与基础树有一个公共点。谁无路可走谁输。输入多组数据每组数据第一行m和k表示m个节点,k条边,1为根节点接下来k行描述边输出对于每组数据输出谁必胜#原创 2015-08-18 11:13:20 · 503 阅读 · 0 评论 -
poj解题报告——2234
题意:有n堆石子,每人每次可以从一堆中拿走任意多个,两人轮流操作,谁无子可取谁输。输入n堆石子各自的数量,输出先手是否能赢。分析:NP问题,必胜态N(next player wins),必败态P(previous player wins)如果某状态的直接后继中有必败态那么它一定是必胜态,否则为必败态。SG函数。设函数f(x)。先把所有的最终局面(最终局面均为必败P局面)f(x)赋值为0原创 2015-08-05 09:14:11 · 392 阅读 · 0 评论 -
poj解题报告——2068
题目是说有2*n个人坐在一起,分为2组交叉坐,共有s个石头,每次挨着取石头,石头不能超过当前人取最大的限制,若谁取到最后一个石头,那么就算失败。现在问我方是否能胜利,胜利输出1,失败输出0。dp[i][j]表示为第i个人剩下j个石头的胜负情况。#include#include#includeusing namespace std;const int maxn=8200;int原创 2015-08-16 11:34:54 · 432 阅读 · 0 评论 -
poj解题报告——1740
还是一道博弈论的题目题意:对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆。最后谁无子可取即输。分析:首先考虑两堆相等的情况,一定是谁取谁输,因为对方永远可以做对称的操作。对于四堆,1、2堆相等,3、4堆相等的情况,一定也是先手输,后手也只需要做对称的操作(在先手取石子的对称堆中取相同多的石子,并原创 2015-08-04 10:48:26 · 472 阅读 · 0 评论 -
poj解题报告——1067
本题是一道威佐夫博奕。下面借用别人整理的3种博弈。(一)巴什博弈(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。很容易想到当n%(m+1)(二)威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。如果甲面对(0,0)原创 2015-08-04 10:36:54 · 494 阅读 · 0 评论 -
poj解题报告——3480
先手胜当且仅当(1)所有堆石子数都为1且游戏的SG值为0 ,(2)存在某堆石子数大于1且游戏的SG值不为0 证明:(1)若所有堆石子数都为1且SG值为0,则共有偶数堆石子,故先手胜。(2)i)只有一堆石子数大于1时,我们总可以对该堆石子操作,使操作后石子堆数为奇数且所有堆得石子数均为1ii)有超过一堆石子数大于1时,先手将SG值变为0即可,且总还存在某堆石子数大于1原创 2015-08-17 10:35:58 · 376 阅读 · 0 评论 -
poj解题报告——2960
经典的Nim游戏题目中已经给出了——每一堆选取的数量没有限制。S-Nim游戏仅仅是限制了每一次从每一堆中选取的个数,依旧用sg函数计算即可。经典的Nim游戏中sg(x) = x,所以结果就是每一堆的状态直接xor即可,S-Nim游戏先计算每一堆的sg函数值,然后判断方法依旧是用xor。#include#include#include#define N 100+10int k原创 2015-08-14 18:55:08 · 414 阅读 · 0 评论 -
poj解题报告——1704
题意是在n个格子中放m个球,每次轮流只能移动一个球,球不能超过前面一个球,刚刚开始写这题,由于他的sg值是变化的,每个球随着前面的球的位置改变,sg值在变,一直思考无果,后来看看别人的题解,才明白这题的sg值怎么求。分析如下,最终状态必然所有的的球排满前m个小格,若将它恢复原来的样子,必须先把最后两个间隔恢复,接着两个都要后移,发现在移动的过程中,一对球的相对位置没有改变,因为移动前一个球多少原创 2015-08-15 10:45:16 · 411 阅读 · 0 评论 -
poj解题报告——2425
题意:给一个有向无环图,给M枚棋子,每个人可以移动一个棋子,棋子可以重叠。直到无法移动者Lose算法:按照Topo顺序,依次计算每个点的SG值,然后做合并,注意,先dfs后合并,判断重复#include#include#include#includeusing namespace std;const int NN=1001;int mp[NN][NN];int x[NN],n原创 2015-08-13 12:03:32 · 435 阅读 · 0 评论 -
poj解题报告——2484
题意:这题有个提示,从中间取,则算断开的两节,比如12345,先手取3,则另一个只能从12,45里取,不能取24;因此只要第一次取不完,另一个人从中间取,就输掉了。#includeusing namespace std;int main(){ int n; while(scanf("%d",&n)&&n) { if(n>2) printf("Bob\n"); el原创 2015-08-12 11:52:26 · 360 阅读 · 0 评论 -
poj解题报告——2505
假设输入的数是N,如果"我方"想赢,则必然"我方"在赢之前,必须 "我方"达到这样一个数:N/18<=(M1)<N/9. 然而,对方是不会让"我方"达到M1的情况的,所以对方给出的M2这个数,至少 应符合这样的条件:(M2)*2<N/9并且(M2)*9>=N/18.对方是不会甘心 让这个数在他手中出现的,所以"我方"给出的(M3)必须让对手无论怎样都能达到M2 这样的要求,所以(M3)*9<N/(原创 2015-08-11 11:26:18 · 396 阅读 · 0 评论 -
poj解题报告——3537
题意有个2人玩的游戏在一个规模为1*n的棋盘上进行,每次一个人选择一个地方画上'X',一旦某个人画上X后出现了连续3个X,那么这个人就赢了。给n(3≤n≤=2000)问谁会赢。题解考虑到如果画上一个X,就会有临近区域不能画X,也就是下一个人能画X的区域就变了,那么问题可以转换为谁不能画X谁就输了。接着考虑每次画X的转移情况,最简单的就是画最左边的1~3个格子,这时剩下还有n-3~n原创 2015-08-20 10:10:48 · 444 阅读 · 0 评论