[恩分到动归分类好了]取石子游戏

【描述】

Dragon同学最近经常和Dick同学玩一种取石子游戏:开始有一堆共n颗石子,Dragon和Dick轮流从这对石子中取走不超过m颗石子,取走最后一颗石子的人就输了。Dragon博士不够聪明,总是输了。怎么办呢?Dragon博士就来请教聪明的你,给定n、m,假定Dragon博士先取,到底他是否有必胜的把握呢?

【输入格式】

有多组输入。

每行两个正整数n、m,意义如上文。

【输出格式】

对于每组输入输出一行,如果有必胜的把握则输出‘Your are stupid.’否则输出‘That’s a pity’。

【样例输入】

5 1

3 3

【样例输出】

That’s a pity

Your are stupid.

【分析】

设f[m][n]表示m的限制下,剩下n个石子,可不可以必胜。我们看f[m][n-1]~f[m][n-m],如果其中有一个必败的状态,那么f[m][n]就是必胜,否则为必败。

预先把所有的f[m][n]都算出来。

#include <stdio.h>
#define maxn 110

bool f[maxn][maxn];
int tot,n,m;
bool can;

int main()
{
    freopen("stone.in","r",stdin);
    freopen("stone.out","w",stdout);
    
    for (m=1;m<=100;++m)
        for (n=2;n<=100;++n)
        {
            can=0;
            for (int i=n-1;i>=n-m;--i)
            {
                if (i<=0) break;
                if (!f[m][i])
                {
                             can=1;
                             break;
                }
            }
            f[m][n]=can; 
        }
        
    while (scanf("%d%d",&n,&m)!=EOF)
    {
        if (f[m][n]) printf("Your are stupid.\n");
        else printf("That's a pity.\n");
    }
    
    return 0;
}

 

 

posted @ 2010-09-22 18:16  Sephiroth.L.  阅读(261)  评论(0)    收藏  举报