一道我觉得不错的博弈题目
思路
最下方有别人的链接,不是很理解那种思路。
写写自己的思路。
首先我们知道 Alice 先手,可走 1 步 2 步 或 k 步,可以确定的是 0 处为 Bob 的必胜态,也就是,0 处为后手的必胜态。
在这里,我将后手的必胜态称为Bob必胜态,简称B。同理,先手必胜态简称为A。
我们先不考虑k,考虑没有k的情况
没有k的时候
0 处 + 1 和 + 2 的 位 置 为 A , 0 处 + 3 的 地 方 为 B 0处 +1 和 +2 的位置为A,0 处 + 3 的地方为B 0处+1和+2的位置为A,0处+3的地方为B
再 往 后 推 导 , 我 们 可 以 发 现 , 跳 到 B 的 人 必 胜 , 所 以 每 个 人 的 目 标 都 是 跳 到 B 。 将 3 处 看 成 0 处 , 继 续 往 后 推 。 我 们 可 以 发 现 , 当 n % 3 = = 0 时 , B o b 必 胜 , 当 n % 3 ! = 0 时 , A l i c e 必 胜 。 再往后推导,我们可以发现,跳到B的人必胜,所以每个人的目标都是跳到B。 将3处看成 0 处,继续往后推。我们可以发现,当n\%3 == 0时,Bob必胜,当n\%3!= 0时,Alice必胜。 再往后推导,我们可以发现,跳到B的人必胜,所以每个人的目标都是跳到B。将3处看成0处,继续往后推。我们可以发现,当n%3==0时,Bob必胜,当n%3!=0时,Alice必胜。
也 就 是 说 : 不 考 虑 k 时 , 3 的 倍 数 的 位 置 为 B , 其 他 为 A 也就是说:不考虑k时,3的倍数的位置为B,其他为A 也就是说:不考虑k时,3的倍数的位置为B,其他为A
我们再在这个基础上,考虑含有k的情况.
一、 首 先 考 虑 k % 3 = = 1 的 情 况 , 我 们 知 道 这 时 候 从 B 往 后 + 1 或 + 2 或 + k 的 状 态 应 该 是 A , 而 对 于 每 个 B , 在 原 先 的 基 础 上 + k 依 然 还 是 为 A , 对 原 先 的 结 论 没 有 影 响 , 没 有 修 改 。 首先考虑k\%3 == 1的情况,我们知道这时候从 B 往后+1 或 +2 或 +k 的状态应该是A,而对于每个B,在原先的基础上 +k 依然还是为A,对原先的结论没有影响,没有修改。 首先考虑k%3==1的情况,我们知道这时候从B往后+1或+2或+k的状态应该是A,而对于每个B,在原先的基础上+k依然还是为A,对原先的结论没有影响,没有修改。
二、 同 理 , 当 k % 3 = = 2 时 , 也 没 有 造 成 影 响 同理,当k\%3 == 2时,也没有造成影响 同理,当k%3==2时,也没有造成影响
三、
最后我们考虑k%3
==
0的情况
\textbf{最后我们考虑k\%3 == 0的情况}
最后我们考虑k%3 == 0的情况
经
过
推
导
可
发
现
,
它
是
一
个
以
k
+
1
的
长
度
为
周
期
的
循
环
节
,
对
于
每
一
个
周
期
[
1
,
k
+
1
]
中
的
第
p
o
s
个
位
置
,
p
o
s
%
3
!
=
0
处
以
及
第
p
o
s
=
=
k
处
都
是
A
,
其
他
位
置
则
为
B
。
经过推导可发现,它是一个以k + 1的长度为周期的循环节,对于每一个周期[1,k+1]中的第pos个位置,pos\%3 != 0 处 以及 第pos == k处都是A,其他位置则为B。
经过推导可发现,它是一个以k+1的长度为周期的循环节,对于每一个周期[1,k+1]中的第pos个位置,pos%3!=0处以及第pos==k处都是A,其他位置则为B。
在三中,Alice获胜只有两种情况: n % ( k + 1 ) % 3 ! = 0 n\%(k +1) \%3 != 0 n%(k+1)%3!=0以及 n % ( k + 1 ) = = k n\%(k +1) == k n%(k+1)==k处
n % ( k + 1 ) % 3 ! = 0 n\%(k +1) \%3 != 0 n%(k+1)%3!=0也就是之前的基础。
n % ( k + 1 ) = = k n\%(k +1) == k n%(k+1)==k,这时候Alice有能力跳至B(跳k步),此时Alice能赢。
其余的都是B。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
int main(){
scanf("%d", &t);
while(t--){
int n, k;
scanf("%d %d", &n, &k);
if(k % 3 == 0)
if(n % (k + 1) % 3 != 0 || n % (k + 1) == k)
puts("Alice");
else
puts("Bob");
else
if(n % 3 != 0)
puts("Alice");
else
puts("Bob");
}
return 0;
}
参考来源
https://www.cnblogs.com/think-twice/p/11190574.html