硬币游戏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 1000
using 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;
}