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 的情况在代码中有说明
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";}}}