[恩分到动归分类好了]取石子游戏
【描述】
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;
}
浙公网安备 33010602011771号