题目链接:
题目描述:
Alice和Bob在玩弹珠游戏,两人轮流拿走弹珠,每次只能拿走一个或者两个,当Alice作为先手时谁拿走最后一个就是输家,而Bob作为先手时谁拿走最后一个就是赢家,问最后谁是赢家?
解题思路:
很基础的博弈题目,我们可以知道当Alice作为先手的时候:n=1(Alice lose), n=2(Alice win), n=3(Alice win), n=4(Alice lose), n=5(Alice win).
从上面可以看出,因为每次可以取走一个或者两个,Alice肯定做出对自己有利的抉择,所以有a[n] = !(a[n-1] && a[n-2])(1为win,0为lose) 。
对于Bob作为先手也是类似于上面的推到方法,a[n] = !(a[n-1] && a[n-2])。
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main () 4 { 5 long long n, t, l = 0; 6 char str[10]; 7 scanf ("%lld", &t); 8 while (t --) 9 { 10 scanf ("%lld %s", &n, str); 11 if (!strcmp(str, "Bob")) 12 { 13 if (n %3 == 0) 14 printf ("Case %lld: Alice\n", ++l); 15 else 16 printf ("Case %lld: Bob\n", ++l); 17 } 18 else 19 { 20 if (n % 3 == 1) 21 printf ("Case %lld: Bob\n", ++l); 22 else 23 printf ("Case %lld: Alice\n", ++l); 24 } 25 } 26 return 0; 27 }
。