GOJ 1069(巴什博奕)

这是一道简单博弈题。
1069题目
勇敢者的游戏(简单博弈)
Time Limit: 2000/1000ms (Java/Others)

Problem Description:
有一部电影就叫《勇敢者的游戏》(英文名称:Zathura),而对于我们来说,参加这场“ War of Code”也是“勇敢者的游戏”。当然,除了“勇敢”,我们还希望看到“诚信”,无论考试成绩如何,希望看到的都是一个真实的结果,也相信大家一定能做到的~
各位勇敢者要玩的第一个游戏是什么呢?很简单,它是这样定义的:
1、 本游戏是一个二人游戏;
2、 有一堆石子一共有n个;
3、 两人轮流进行;
4、 每走一步可以取走1…m个石子;
5、 最先取光石子的一方为胜;
如果游戏的双方使用的都是最优策略,请输出哪个人能赢。

Input:
输入数据首先包含一个正整数C(C<=100),表示有C组测试数据。
每组测试数据占一行,包含两个整数n和m(1<=n,m<=1000),n和m的含义见题目描述。

Output:
如果先走的人能赢,请输出“first”,否则请输出“second”,每个实例的输出占一行。

Sample Input:
2
23 2
4 3

Sample Output:
first
second

本题思路:因为双方采取的都是最优策略,即游戏最开始的数量n,m已经决定了哪个玩家的输赢。有n个石子,一次可以取最多m个,最少1个,赢的玩家必须拿到最后的石头,那么玩家想赢,必须把每回合取的石头总数控制在某个数中,且这个数能被n整除。因为一次可以取最多m个,最少1个,所以每回合取的石头总数为m+1的话,当n%(m+1)==0时,后来的玩家赢;(因为不管前面玩家怎么取,只要后面的玩家每次取的石头数量为(m+1-x),那么后面的玩家一定可以取到最后的石头)如果n%(m+1)!=0,则为前面的玩家赢(嘻嘻,这就反过来想就可以了,只要前面玩家第一次把n的数量变为n可以被(m+1)整除就可以了)

AC代码:

#include
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        int m;
        cin>>n>>m;
        if(n%(m+1))
            cout<<"first"<else
            cout<<"second"<return 0;
}

版权声明:本文为博主原创文章,代码仅用于交流和学习!转载请注明出处!

你可能感兴趣的:(GOJ,博弈)