POJ_1740 A New Stone Game 博弈

http://poj.org/problem?id=1740

題意:

給你N堆石子,每堆石子都有一定的數量,有兩個人玩一個遊戲,遊戲的規則是每個人每次可以選擇一堆石子,並從中去掉至少一顆石子,然後可以選擇將剩下的石子分到其他還有石子的堆中去,問先手還是後手有必勝策略。

思路:

有一堆石子的時候,先手只要將其所有的都扔掉就可以獲勝,因此先手有必勝策略;

有兩堆石子的時候,如果兩堆石子數量相同,則後手只要跟着先手的走法,維護兩堆石子的數量一樣就有必勝策略;如果兩堆石子數量不同,先手一定可以將其變成兩堆數量相同的石子從而獲得必勝的策略;

有三堆石子的時候,先手一定可以通過轉化,變成兩堆數量一樣的石子,因此也有必勝策略。

有四堆石子的時候,因爲上面已經分析了,如果兩堆石子的數量是一樣的話,先手必敗,也就是說,在四堆裏面,一旦先手去改變兩堆相同,後手一定也可以在那兩堆中操作,維護兩堆的相同,這樣最後一定是先手先沒有石子拿而要去拿另外的石子堆,這樣也就說明兩兩相同的石堆我們可以將其去除,這樣就剩下不相同的石堆了。 這時候先手總可以將數量最多的石堆的石頭移到其他堆裏面去從而實現石堆的兩兩相等,從而有了必勝的策略。

總結:如果石堆的數量是奇數,則先手有必勝策略;如果石堆的數量是偶數,而且石堆石子的數量兩兩相同,則後手有必勝策略。

代碼:

#include <stdio.h>
#include <string.h>

int num[110] ;

int main(){
    int N , a ;

    while( scanf("%d",&N) && N ){
        memset(num , 0 ,sizeof(num) ) ;
        for(int i=1;i<=N;i++){
            scanf("%d",&a) ;
            num[a] ^= 1 ;
        }
        if( N&1 )   printf("1\n");
        else{
            bool ok = 0 ;
            for(int i=1;i<=100;i++){
                if( num[i] )    ok = 1 ;
            }
            if( !ok )   printf("0\n") ;
            else        printf("1\n") ;
        }
    }
    return  0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章