就是必胜点与必败点的计算而已。计算每一种情况。设st[i][j]为在第i个人剩下j个石头时的情况,拿它转移后的情况比较。可以到达必败点,则当前为必胜点。若只能到达必胜点,则当前点为必败点。
1 #include <iostream>
2 #include <cstdio>
3 using namespace std;
4 const int S=8330;
5 const int N=22;
6
7 int st[N][S];
8 int s,n;
9 int MA[N];
10
11 int main(){
12 int k,i,j;
13 while(scanf("%d",&k)!=EOF){
14 if(!k) break;
15 scanf("%d",&s);
16 n=2*k;
17 for(i=1;i<=n;i++)
18 scanf("%d",&MA[i]);
19 for(i=1;i<=n;i++)
20 st[i][0]=1;
21 for(j=1;j<=s;j++){
22 for(i=1;i<=n;i++){
23 st[i][j]=0;
24 if(i==n){
25 for(k=1;k<=MA[i];k++){
26 if(j-k>=0){
27 if(st[1][j-k]==0){
28 st[i][j]=1;
29 break;
30 }
31 }
32 else break;
33 }
34 }
35 else{
36 for(k=1;k<=MA[i];k++)
37 if(j-k>=0){
38 if(st[i+1][j-k]==0){
39 st[i][j]=1;
40 break;
41 }
42 }
43 else break;
44 }
45 }
46 }
47 printf("%d\n",st[1][s]);
48 }
49 return 0;
50 }
时间: 2024-12-15 05:17:42