<Sicily>Funny Game

本文介绍了一个基于两个自然数的博弈游戏,详细解释了游戏规则和获胜条件,并提供了一段C++代码实现,用于判断初始状态下哪位玩家能赢得游戏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目描述

Two players, Singa and Suny, play, starting with two natural numbers. Singa, the first player, subtracts any positive multiple of the lesser of the two numbers from the greater of the two numbers, provided that the resulting number must be nonnegative. Then Suny, the second player, does the same with the two resulting numbers, then Singa, etc., alternately, until one player is able to subtract a multiple of the lesser number from the greater to reach 0, and thereby wins. For example, the players may start with (25,7):

     25 7

     11 7

      4 7

      4 3

      1 3

      1 0

an Singa wins.

二、输入

The input consists of a number of lines. Each line contains two positive integers (<2^31) giving the starting two numbers of the game. Singa always starts first. The input ends with two zeros.

三、输出

For each line of input, output one line saying either Singa wins or Suny wins assuming that both of them play perfectly. The last line of input contains two zeroes and should not be processed.

四、解题思路

一开始,看完题目完全没头绪,不知道从何下手。后来想想,这是一个博弈游戏,按照游戏规则,如果其中一个数不比另外一个数大一倍或一倍以上时,游戏将进行简单地相减。

if(nultipleNum2 > nultipleNum1)
    nultipleNum2 -= nultipleNum1;

如果,出现一个数是另外一个数的n倍,游戏结束。
当其中一个数是另外一个数的二倍以上(n倍)时,这时玩家可以根据逆推的方法选择减去n倍或者n-1倍,以达到让自己赢的情况。

五、代码

#include<iostream>

using namespace std;

int main()
{
    int num1, num2;
    cin >> num1 >> num2;

    while(num1 || num2)
    {
        int nultipleNum1, nultipleNum2;
        nultipleNum1 = num1;
        nultipleNum2 = num2;
        int result = 0;    //记录轮到谁,1:Singa,0:Suny

        while(nultipleNum1 && nultipleNum2) //如果两个数都大于0,游戏继续
        {
            result++;
            result %= 2;
            if(nultipleNum1 > nultipleNum2)
            {
                if(nultipleNum1 / nultipleNum2 >= 2) break;     //当遇到一个数是另外一个数的两倍或两倍以上时,即能赢得游戏
                else nultipleNum1 -= nultipleNum2;
            }else
            {
                if(nultipleNum2 / nultipleNum1 >= 2) break;
                else nultipleNum2 -= nultipleNum1;
            }
        }

        if(result == 1) cout << "Singa wins" << endl;
        else cout << "Suny wins" << endl;

        cin >> num1 >> num2;
    }

    return 0;
}
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值