硬币游戏2
挑战程序设计竞赛P315
1堆的情况:
1 #include<bits/stdc++.h> 2 int x=9,grundy[1000],k=2,A[1000]={1,4},n=3; 3 using namespace std; 4 int main(){ 5 grundy[0]=0; 6 for(int i=1;i<=9;i++){ 7 set<int>s; 8 for(int j=0;j<k;j++){ 9 if(i>=A[j]) s.insert(grundy[i-A[j]]); 10 } 11 int g=0; 12 if(s.count(g)!=0) g++; 13 grundy[i]=g; 14 } 15 if(grundy[x]) printf("Alice\n"); 16 else printf("Bob\n"); 17 18 }
n堆的情况:
1 #include<bits/stdc++.h> 2 #define MAX_N 1000 3 #define MAX_K 1000 4 #define MAX_X 1000 5 using namespace std; 6 int N=3,K=3,X[MAX_N]={5,6,8},A[MAX_K]={1,3,4}; 7 int grundy[MAX_X+1]; 8 int main(){ 9 grundy[0]=0; 10 int max_x=*max_element(X,X+N); 11 12 for(int i=1;i<=max_x;i++){ 13 set<int>s; 14 for(int j=0;j<K;j++){ 15 if(A[j]<=i) s.insert(grundy[i-A[j]]); 16 } 17 int g=0; 18 while(s.count(g)!=0) g++; 19 grundy[i]=g; 20 } 21 22 int x=0; 23 for(int i=0;i<N;i++) x^=grundy[X[i]]; 24 25 if(x!=0) puts("Alice\n"); 26 else puts("Bob\n"); 27 return 0; 28 }
时间: 2024-10-06 05:36:12