HDU 1404 (博弈) Digital Deletions

首先如果第一个数字是0的话,那么先手必胜。

对于一个已知的先手必败状态,凡是能转移到先手必败的状态一定是必胜状态。

比如1是必败状态,那么2~9可以转移到1,所以是必胜状态。

10,10*,10**,10***,10****也都可以删除1后面那个0,转移到1,所以也是必胜状态。

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <cstdlib>

 4 

 5 const int maxn = 999999;

 6 int sg[maxn + 10];

 7 

 8 void init()

 9 {

10     char s[10], s1[10];

11     for(int i = 1, j; i <= maxn; i++) if(!sg[i])//先手必败点

12     {//所有能转移到先手必败的状态都是先手必胜状态

13         sprintf(s, "%d", i);

14         int n = strlen(s);

15         for(j = 0; j < n; j++)

16         {//每一位都加上1

17             strcpy(s1, s);

18             while(++s1[j] <= '9') sg[atoi(s1)] = 1;

19         }

20         int m = i, b = 1;

21         for(int j = n; j < 6; j++)

22         {//在后面添0

23             m *= 10;

24             for(int k = 0; k < b; k++) sg[m + k] = 1;

25             b *= 10;

26         }

27     }

28 }

29 

30 int main()

31 {

32     init();

33     char s[10];

34     while(scanf("%s", s) == 1)

35     {

36         if(s[0] == '0') { puts("Yes"); continue; }

37         int n = 0, l = strlen(s);

38         for(int i = 0; i < l; i++) n = n * 10 + s[i] - '0';

39         printf("%s\n", sg[n] ? "Yes" : "No");

40     }

41 

42     return 0;

43 }
代码君

 

你可能感兴趣的:(git)