取石子游戏怎么赢

Problem Description 两个足够聪明的人玩轮流取石头的游戏,谁取到最后一个石头谁就赢了,他们一次只能取1个、3个、7个或8个石头,写一程序判断n个石头时先取的人是输还是赢。 输入格式: 一个整数n,其值不超过10000000。 输出格式: 如果先取的人赢,请以单独一行输出1,

  • Problem Description

两个足够聪明的人玩轮流取石头的游戏,谁取到最后一个石头谁就赢了,他们一次只能取1个、3个、7个或8个石头,写一程序判断n个石头时先取的人是输还是赢。

输入格式:
一个整数n,其值不超过10000000。
输出格式:
如果先取的人赢,请以单独一行输出1,否则输出0。

输入样例:
这里是3组输入。

1
10
300

输出样例:
上面3组数据对应的输出分别如下:

1
1
0

  • 问题解读

首先这两个人都足够聪明。假使第一个人先取,他会想尽办法赢。但第二个人也不是吃素的,他会不遗余力的阻击第一个人赢。由于石头数不确定,我们不妨先用较小数目的石头试试水,看看能否找到规律。

  • 枚举分析

我们假设 P 1 P_1 P1 P 2 P_2 P2分别代表第一个人和第二个人,且第一个人先取,现在来枚举几种情况,看看第一个人什么情况下去会赢。

一个石头:

在这里插入图片描述

注:第一个人赢。

两个石头:

在这里插入图片描述

注:第一个人输。

三个石头:

第一种情况:

在这里插入图片描述

注:第一个人赢。

第二种情况:

在这里插入图片描述

注:第一个人赢。

四个石头:

第一种情况:

在这里插入图片描述

注:第一个人赢。

第二种情况:

在这里插入图片描述

注:第一个人赢。

五个石头:

第一种情况:

在这里插入图片描述

注:第一个人赢。

第二种情况:

在这里插入图片描述

注:第一个人赢。

第三种情况:

在这里插入图片描述

注:第一个人赢。

继续枚举,发现当石头数为:2 4 6 15 17 19 30 32 34 36 45 47 49 51……时,第二个人赢。观察这些数据可以发现:当n%15==0或2或4或6时,第二个人赢,其余情况第一个人赢。这样,我们就找到了规律。

  • 代码实现

#include<iostream>
using namespace std;
int main()
{
	int n;
	while(cin>>n)
	{
	    if(n%15==0)
            cout<<0;
        else if(n%15==2)
            cout<<0;
        else if(n%15==4)
            cout<<0;
        else if(n%15==6)
            cout<<0;
        else
            cout<<1;
	}
	return 0;
}
  • 运行结果

在这里插入图片描述

知秋君
上一篇 2024-08-25 22:12
下一篇 2024-08-25 21:48

相关推荐