Nim K博弈與SG值存疑 POJ 2315

2022-05-01 03:39:11 字數 2145 閱讀 6180

問題轉化成, 有 \(n\) 堆石子, 博弈雙方每次可以選擇不超過 \(k\) 堆, 每堆取不超過 \(x\) 個, 總的取石子數至少為 \(1\). 最後沒有石子可取的一方判負. 問勝利方.

對於單堆來說是乙個巴什博弈, \(sg\) 值為石子數模 \(x+1\).

\(nim k\) 博弈是在 \(nim\) 博弈的基礎上, 把每次選擇一堆石子擴充套件成 \(1-k\) 堆. 其做法是, 把所有石子數轉成二進位制, 每一位做模 \(k+1\) 的加法, 若最後結果不為 \(0\) 先手勝, 否則後手勝.

相關的證明

poj2315 ac **

#define inc(i, l, r) for (int i = l; i <= r; i++)

const double pi = acos(-1.0);

int n, m, l, r;

int sg[35], num[35];

int main()

}int fail = 1;

inc(i, 0, 31) if (num[i] % (m + 1)) fail = 0;

if (fail)

printf("bob\n");

else

printf("alice\n");

}}

看起來好像沒啥問題? 但是, 我在打表的結果裡發現了不止乙個對不上結論的資料.

打表程式

#include using namespace std;

#define ll long long

#define inc(i, l, r) for (int i = l; i <= r; i++)

const int maxn = 6; //打表石子數的上限

const int n = 4; //石子堆數

const int m = 2; //最多取多少堆

const int x = 2; //每堆至多取

#define ar arraymapmp;

ar target, now;

int dfs(int top)

return 1;

}inc(i, 0, min(x, target[top]))

}return 1;

}int num[35];

ar b;

void solve(int top)

*/int succ = 0;

inc(i, 0, 31) num[i] = 0;

inc(i, 0, n - 1)

}inc(i, 0, 31) if (num[i] % (m + 1)) succ = 1;

if (mp[b] != succ)

return;

}inc(i, 0, maxn)

}int main()

部分打表結果

mp[b] is 1 succ is 0

1 1 1 3

mp[b] is 1 succ is 0

1 1 1 6

mp[b] is 1 succ is 0

1 1 3 1

mp[b] is 1 succ is 0

1 1 3 4

mp[b] is 0 succ is 1

1 1 3 5

...

取 \(n=4,k=2,x=2\), 石子數分別為 \(1,1,1,3\), 按照理論做法, 取 \(sg\) 值為 \(1,1,1,0\), 二進位制下每一位做模 \(k+1\) 的做法, 結果為 \(0\), 先手必敗. 但事實上先手走 \(0,1,1,1\), 這是乙個很顯然的必敗態, 即 \(1,1,1,3\) 實際上是必勝的.

那麼問題是出在哪了? 個人認為是 \(sg\) 值不能和 \(nim k\) 博弈套在一起. 因為按照證明的流程, 每次都有 \(k\) 個數可以改變, 但實際上, 如果對手取的石子使 \(sg\) 值增大, 我方就必須把增大的 \(sg\) 值取回去, 也就是說並不一定還有 \(k\) 個數可以給我改變. 原本 \(nim\) 博弈可以用 \(sg\) 值, 是因為對手使 \(sg\) 值增大時, 我方再取回去, 相當於沒有變化, 所以只考慮 \(sg\) 值變小的情況.

所以說 \(poj2315\) 其實是假題? 不懂..

poj 2234基礎Nim博弈 sg博弈

poj 終於突破200大關了,mark一下。hdu也快要300了。加油 題意 有n堆石子,每人每次可以從一堆中拿走任意多個,兩人輪流操作,誰無子可取誰輸。輸入n堆石子各自的數量,輸出先手是否能贏。分析 np問題,必勝態n next player wins 必敗態p previous player w...

POJ2960 S Nim(博弈論 sg函式)

題意 給出一系列石子堆,現在每次只能從乙個堆中拿出固定石子數,問輸贏結果。要點 跟nim博弈很像,但是這次每次只能拿固定個數,所以要用sg函式,下面是sg函式的具體定義 sg x mex sg y y是x的後繼結點 其中mex x x是乙個自然是集合 函式是x關於自然數集合的補集中的最小值,比如x ...

POJ 2960(S Nim) 博弈論,SG函式

題意 兩個人玩遊戲,規則是有n堆石子,分別有a1,a2,an顆石頭,每次從一堆石子中取一些石子,但是可取的石子數是規定了的,必須是中的乙個,誰無法操作就輸。思路 一開始我還是不懂的,不知道怎麼選擇sg函式值。但是回去研讀了一下sg函式的定義,就明白了 相對於樸素的nim遊戲,可取的石子數是有限制的,...