基礎組合遊戲合集

2022-09-21 12:54:09 字數 1656 閱讀 4553

定義

尼姆博弈的定義是:

給定 \(n\) 堆物品,第 \(i\) 堆物品有 \(a_i\) 個,兩人輪流取,每次可以任選一堆取走任意多個物品,可以取光但不能不取,最後把物品全部取完者勝利

判斷先手是否有必勝策略

結論\(a_1\oplus a_2\oplus\cdots\oplus a_n\not=0\) 時先手必勝

證明參考 尼姆博弈原理與證明

例題poj 2234

#include#includeusing namespace std;

int main()

printf("%s\n", res ? "yes" : "no");

}return 0;

}

定義

巴什博弈的定義是:

有一堆物品,兩人輪流取,每次可以取 \(1\) 到 \(m\) 個物品,最後把物品全部取完者勝利

現在給出初始的物品數 \(n\) 和 \(m\) ,判斷先手是否有必勝策略

結論\(m+1\mid n\) 時先手必敗

證明參考 巴什博弈原理與證明

例題hdu 1846

#include#define ll long long

using namespace std;

int main()

return 0;

}

定義

斐波那契博弈的定義是:

有一堆物品,兩人輪流取,先手第一次可以取任意個但不能全部取完。之後每次取的數量必須大於等於 \(1\) 且小於等於上次取的數量的兩倍,最後把物品全部取完者勝利

現在給出初始的物品數 \(n\) ,判斷先手是否有必勝策略

結論\(n\) 為斐波那契數數時先手必敗

證明參考 斐波那契博弈原理與證明

例題hdu 2561

#includeusing namespace std;

int f[200 + 5];

mapmp;

int main()

int x;

while(scanf("%d", &x) != eof && x)

printf("%s\n", mp[x] ? "second win" : "first win");

return 0;

}

定義

威佐夫博弈的定義是:

有兩堆若干個物品,兩人輪流從某一堆物品中取至少乙個或同時從兩堆中取相同數量的物品,不能不取,最後把物品全部取完者勝利

現在給出兩堆物品的數量 \(n,m\) 判斷先手是否有策略必勝

結論如果 \(n\leq m\) 那麼 \(n=\lfloor(m-n)(\frac)\rfloor\) 時先手必敗

證明參考 威佐夫博弈原理與證明

例題luogu p2252

#includeusing namespace std;

const double r = (sqrt(5.0) + 1.0) / 2.0;

int main()

前端 陣列合集

1.array.isarray es5 2.instanceof array 3.arr.constructor array 4.tostring.call object array 方法 描述 concat 連線兩個或更多的陣列,並返回結果。join 把陣列的所有元素放入乙個字串。元素通過指定的分...

NOIP2015 提高組合集

noip 2015 提高組 合集 d1 t1 神奇的幻方 題目讓你幹啥你就幹啥,讓你咋走你就咋走就完事兒了 include include include include define n 50 using namespace std struct node a n n int ans n n in...

NOIP2011 提高組合集

noip 2011 提高組合集 d1 t1 鋪地毯 模擬,題目讓你幹啥你就幹啥 include include using namespace std int x 100010 y 100010 dx 100010 dy 100010 int main printf d n r return 0 d...