摘要:
没什么好说的,博弈简单题,懂得SG改下s数组大体都一样详细讲解类试题1850#include
#include
#include
using namespace std;
int n,m,p,sg[1003],h[1003],s[20];
void Sg()
{ int i,j; for(i=0;i=0)h[sg[i-s[j]]]=1; for(j=0;j<1003;j++) if(h[j]==0) { sg[i]=j; break; } }
}
int main()
{ s[0]=1;s[1]=2; for(int ... 阅读全文
摘要:
#include
#include
#include
using namespace std;
int n,m,sg[1003],h[1003],s[14];
void Sg()
{ int i,j; for(i=0;i=0)h[sg[i-s[j]]]=1; for(j=0;j<1003;j++) if(h[j]==0) { sg[i]=j; break; } }
}
int main()
{ for(int i=0;i<14;i++) s[i]=1<<i; while(scanf("%d",&n)!=EOF)
... 阅读全文
摘要:
简单博弈,懂得SG函数就能A#include
#include
#include
using namespace std;
int main()
{ int n,m,sg[1003],h[1003]; scanf("%d",&m); while(m--) { int i,j,k; scanf("%d%d",&n,&k); for(i=0;i=0)h[sg[i-j]]=1; } for(j=0;j<1002;j++) { if(h[j]==0) {sg[i]=j;break;} ... 阅读全文
摘要:
SG函数的应用加上^.#include
#include
#include
#define N 10003
using namespace std;
int sg[N];
int s[103],h[103];
int main()
{ int n,m,i,j; //freopen("1.txt","w",stdout); while(scanf("%d",&n)&&n) { for(i=0;i=0) h[sg[j-s[i]]]=1; } for(i=0;i=s[i]&&!sg[j-s[i]]){ 阅读全文
摘要:
pnpnpnpnpnnnnnnnnnpnpnpnpnpnnnnnnnnnpnpnpnpnpnnnnnnnnnpnpnpnpnpnnnnnnnnnpnpnpnpnp步骤1:将所有终结位置标记为必败点(P点);步骤2: 将所有一步操作能进入必败点(P点)的位置标记为必胜点(N点)步骤3:如果从某个点开始的所有一步操作都只能进入必胜点(N点) ,则将该点标记为必败点(P点) ;步骤4: 如果在步骤3未能找到新的必败(P点),则算法终止;否则,返回到步骤2。由表知当n,m均为奇数是为p-必败点#include
int main()
{ int m,n; while(scanf("%d%d&q 阅读全文
摘要:
经典的博弈题啊,必须弄懂必败点条件。这里是对n堆的牌数去异或,如果值为0则表示必败。题目问我们第一布有哪几种方法胜利。即就是第一步能够给对手构建多少个必败点。由于一次只能对一堆排进行操作,假设我 操作第i堆牌(a张),抽出x张。那么其余n-1堆牌的异或值是固定为b.那么 (a - x)^ b == 0 时,对手必败。到此可能有人像我一样觉得必须历遍所有a求出那个值x满足条件。其实不必要由上式可知x只有唯一取值而且 一个数 与 b 异或等于 0 即表明 这个数等于b.所以反过来我们可以求出b, 令 a - x = b ;只要b满足 b int main()
{ int sum,a,b[10... 阅读全文