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;
}