sg值的求解(NIM)

 

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

 

posted @ 2017-04-16 18:21  Elpsywk  阅读(354)  评论(0编辑  收藏  举报