問題描述:
通常的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;
}