2011年湖南省第七屆大學生計算機程序設計競賽,E題,盒子游戲


  2011年湖南省第七屆大學生計算機程序設計競賽,E題,盒子游戲(題目鏈接)。

盒子游戲

Description

  有兩個相同的盒子,其中一個裝了n個球,另一個裝了一個球。AliceBob發明了一個游戲,規則如下: AliceBob輪流操作,Alice先操作。每次操作時,游戲者先看看哪個盒子里的球的數目比較少,然后清空這個盒子(盒子里的球直接扔掉),然后把另一個盒子里的球拿一些到這個盒子中,使得兩個盒子都至少有一個球。如果一個游戲者無法進行操作,他(她)就輸了。下圖是一個典型的游戲:

game example

  面對兩個各裝一個球的盒子,Bob無法繼續操作,因此Alice獲勝。你的任務是找出誰會獲勝。假定兩人都很聰明,總是采取最優策略。

Input

  輸入最多包含300組測試數據。每組數據僅一行,包含一個整數n(2 ≤ n ≤ 109)。輸入結束標志為 n = 0。

Output

  對於每組數據,輸出勝者的名字。

Sample Input

2
3
4
0

Sample Output

Alice
Bob
Alice

  題目的“游戲者先看看哪個盒子里的球的數目比較少,然后清空這個盒子(盒子里的球直接扔掉),然后把另一個盒子里的球拿一些到這個盒子中”講得不是很明確,導致我做錯了很多次。“兩個盒子里球的數目相等的時候任意清空一個盒子”這句話沒講。結果我誤以為只要兩個盒子里球的數目相等,就無法選擇一個盒子來清空,因此就輸了。實際上題目的意思是:當“清空一個盒子,無法再從另一個盒子中分一部分球過來,使得兩個盒子都至少一個”的時候,才算輸。這一題非常簡單——既然每次都是倒掉球的數目較少的一邊,那么實際上相當於只有球的數目較多的那一個盒子,只剩下一個的時候,就輸了。所以,根據推算,只要輸入的數字是2n-1就一定是Bob贏,否則就是Alice贏。

  C語言源代碼如下:

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    int n;
    while ( scanf( "%d", &n ) , n )
    {
        n ++;
        while ( (n&1) == 0 )
            n >>= 1;
        if ( n == 1 )
            puts( "Bob" );
        else
            puts( "Alice" );
    }
    return EXIT_SUCCESS;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM