尼姆堆

 尼姆堆
【問題描述】
有3堆硬幣,分別是3,4,5
二人輪流取硬幣。
每人每次只能從某一堆上取任意數量。
不能棄權。
取到最後一枚硬幣的爲贏家.


求先取硬幣一方有無必勝的招法。

// 尼姆堆的模2加(異或)解法
/*
10
101
1100
1110
--------
0101
*/
#include<iostream>
using namespace std;
void f3(int* a,int len)
    {
        int sum = 0;
        for (int i = 0; i<len; i++)
        {
            sum ^= a[i];
        }
        if (sum == 0)
        {
            printf("輸了\n");
            return;
        }

        for (int i = 0; i<len; i++)
        {
            int x = sum ^ a[i];
            if (x < a[i]) printf("%d --> %d\n", a[i], x);
        }
    }

    int main()
    {
        int a[] = { 2, 5, 12, 14 };
        f3(a,4);
    }


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