【博弈】【裸題】NIM遊戲的食用方法

問題描述:

通常的Nim遊戲的定義是這樣的:有若干堆石子,每堆石子的數量都是有限的,合法的移動是“選擇一堆石子並拿走若干顆(不能不拿)”,如果輪到某個人時所有的石子堆都已經被拿空了,則判負(因爲他此刻沒有任何合法的移動)。


結論是:

對於一個Nim遊戲的局面(a1,a2,...,an),它是P-position當且僅當a1^a2^...^an=0,其中^表示異或(xor)運算。即把各堆石子數量異或起來。

注:如果Nim遊戲中的規則稍微變動一下,每次最多隻能取K個,解決方法是將每堆石子數mod (k+1).

證明過程網上有很多


下面給出例題:POJ 2234   (一道顯而易見的NIM裸題)


代碼:

#include <iostream>
#include <cstdio>
using namespace std;

int n;
int nim[22];

int winNim()
{
    int x = nim[0];
    for(int i=1;i<n;i++){
        x ^= nim[i];
    }
    return x ? 1 : 0;
}

int main()
{
    //freopen("input.txt","r",stdin);
    while(scanf("%d",&n) != EOF){
        for(int i=0;i<n;i++) scanf("%d",&nim[i]);
        if(winNim())
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}


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