grundy值的求解

来源:互联网 发布:高邮2016秋季网络培训 编辑:程序博客网 时间:2024/06/05 19:32


硬币游戏2

挑战程序设计竞赛P315

1堆的情况:

#include<bits/stdc++.h>int x=9,grundy[1000],k=2,A[1000]={1,4},n=3;using namespace std;int main(){grundy[0]=0;for(int i=1;i<=9;i++){set<int>s;for(int j=0;j<k;j++){if(i>=A[j]) s.insert(grundy[i-A[j]]);}int g=0;    if(s.count(g)!=0) g++;    grundy[i]=g;}if(grundy[x]) printf("Alice\n");else printf("Bob\n");} 




n堆的情况:

#include<bits/stdc++.h>#define MAX_N 1000#define MAX_K 1000 #define MAX_X 1000using namespace std;int N=3,K=3,X[MAX_N]={5,6,8},A[MAX_K]={1,3,4};int grundy[MAX_X+1];int main(){grundy[0]=0;int max_x=*max_element(X,X+N); for(int j=1;j<=max_x;j++){set<int>s;for(int i=0;i<K;i++){if(A[i]<=j) s.insert(grundy[j-A[i]]);}int g=0;while(s.count(g)!=0) g++;grundy[j]=g;}int x=0;for(int i=0;i<N;i++) x^=grundy[X[i]];if(x!=0) puts("Alice\n");else puts("Bob\n");return 0;}


0 0