博 弈

1.题目引入:

Alice 和 Bob 正在玩一个取石子游戏。

共有 nn 个石子,双方轮流采取行动。

每当轮到一人行动时,该名玩家需要从石子堆中取走恰好 11 或 22 或 kk 个石子。

如果轮到一人行动时,已经没有石子可取,则该名玩家失败。

已知,双方都会采取最优策略,且 Alice 率先行动。

请问,最终谁将获胜。

输入格式

第一行包含整数 TT,表示共有 TT 组测试数据。

每组数据占一行,包含两个整数 n,kn,k。

输出格式

每组数据输出一行结果,如果 Alice 获胜,则输出 Alice,否则输出 Bob

数据范围

前三个测试点满足,1≤T≤101≤T≤10。
所有测试点满足,1≤T≤1001≤T≤100,0≤n≤1090≤n≤109,3≤k≤1093≤k≤109。

2.样例输出: 

输入样例:

4
0 3
3 3
3 4
4 4

输出样例:

Bob
Alice
Bob
Alice

 这个题类似于巴什博弈,不同的是 每次只能有三种选择,我们发现当 n<k 时是完全附合巴什博弈的,关键是 n>k 的情况在代码中有说明

022.png

 

3.代码如下: 

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
	int t;
	int n,k;
	cin>>t;
	while(t--)
	{
		cin>>n>>k;
	if(k%3)   // 当 k%3不等于0时有两种情况呢(k 一定大于 3) 
	{
		if(n%3)
		cout<<"Alice\n";
		// 如果 n 是 3的倍数那么无论先手怎样取
		//后手都会将n 变为 3 的倍数直到n小于 k的情形出现 
		//反之先手一定让 n%3 一直出现在后手 
		else cout<<"Bob\n"; 
		 
	}
	// 如果 k 能被 3 整除会出现一个规律 每(k+1)一个循环
	// 100 9 与 10 9 的结果是一样的 
	else
	{
		n%=(k+1);
		if(n==k||n%3) puts("Alice");
		else cout<<"Bob\n";
	}
	}
	
 } 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风遥~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值