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

【描述】

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;

}



 

 

你可能感兴趣的:(游戏)