博弈论——取石子(七)

题目描述:

Yougth和Hrdv玩一个游戏,拿出n个石子摆成一圈,Yougth和Hrdv分别从其中取石子,谁先取完者胜,每次可以从中取一个或者相邻两个,Hrdv先取,输出胜利着的名字。

输入描述:

输入包括多组测试数据。
每组测试数据一个n,数据保证int范围内。

输出描述:

输出胜利者的名字。

样例输入:

复制

2
3

样例输出:

Hrdv
Yougth

 

首先当石子数为1和2时,hrdv肯定获胜,

当石子为3时无论hrdv取一个还是取两个,yougth都能将剩下的全部取走,因此yougth胜

当石子数为4时,若hrdv取两个,yougth取剩下两个就行,若hrdv取一个,yougth只需要取其对应的哪一个就行(如下图,若hrdv取一号石子,yougth只需要取三号石子就能将剩下的石子分成两个石子数一样且不连通的石子堆)这样yougth必胜

博弈论——取石子(七)_第1张图片

 

同样的,如果石子数为5,无论hrdv第一步取一个还是两个石子,yougth都可以在对应位置取不同的石子让其剩下的石子分成两个相同数量但不连通的石子堆(如下图,若hrdv取一号石子,则yougth取3和4号石子,若hrdv取1和2号石子,则yougth取4号石子)

博弈论——取石子(七)_第2张图片

 

同理6个石子,7个石子,8个石子,,,,,往上都可以在hrdv取过之后,yougth通过去对应位置的石子让剩下的石子分为两个数量相同但互不连通的石子堆,这样无论接下来hrdv如何选石子,yougth只需要在另一堆石子的对应位置选择相同数量的石子,到最后yougth就能获胜

所以解题代码为:

#include 
int main ()
{
    int n;
    while (scanf("%d", &n) != EOF)
    {
        if(n > 2)
            printf("Yougth\n");
        else
            printf("Hrdv\n");
    }
    return 0;
}

 

 

 

 

 

 

你可能感兴趣的:(____南阳理工题库,____博弈论)