sicily 1087 a funny game 解题总结
summary
:
题目大意:
N个硬币围成一圈,两个人来博弈,每次只能拿一至两个(相邻),Alice先拿,
最后一个拿的赢,写程序,给定N,判断是谁赢。
分析:
这是一道非常有趣的题,对于像我这样的初学者来说,题目的分析可能要费很大功夫, 但是一旦分析出来,就可以几行代码解决掉。
基本知识:给定N个硬币,排成一列,两个人取,每次只能拿一至两个,则A只需要将这 N个硬币从中间取出一或两个硬币,分成数目相等的两部分,然后B在一边拿多少个,A就 在另一边拿多少个,最终,A必定是最后一个拿的,所以A必定会赢!
延伸到此题:围成一圈的硬币,第一个取的人必定会把圆圈断开成一列,然后,结果被第 二个取的人掌握了,他只需要从中间把这一列分开,最后获胜!
正如我同学的博客所说:我们要让对手不得不打破对称,而我们不断地维持对称,我们才会赢。
代码:
#include
int main()
{
int n;
while(scanf("%d",&n) && n){
if(n == 1 || n == 2){
printf("Alice\n");
}else{
printf("Bob\n");
}
}
return 0;
}