博弈模板(bash,威佐夫,Nim)

2021-07-17 03:26:59 字數 1697 閱讀 1365

寫一些博弈模板,借用51nod上的題目:

bash遊戲:

有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次最少拿1顆,最多拿k顆,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n和k,問最後誰能贏得比賽。

#include using namespace std;

int main()

}return 0;

}

bash遊戲v2:

有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次只能拿1,3,4顆,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n,問最後誰能贏得比賽。

#include using namespace std;

int main()

return 0;

}

bashv3:

有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次拿的數量只能是2的正整數次冪,比如(1,2,4,8,16....),拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n,問最後誰能贏得比賽

#include using namespace std;

char s[1005];

int main()

}if(sign)

printf("a\n");

else

printf("b\n");

}return 0;

}

威佐夫遊戲(精度控制):

有2堆石子。a b兩個人輪流拿,a先拿。每次可以從一堆中取任意個或從2堆中取相同數量的石子,但不可不取。拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出2堆石子的數量,問最後誰能贏得比賽。

#include #include using namespace std;

typedef unsigned long long ull;

const ull gold[3] = ;

const ull mod = 1000000000;

int main()

ull dist = a - b;

ull pre = dist / mod, las = dist % mod;

ull a1 = las * gold[2];

ull a2 = pre * gold[2] + las * gold[1] + a1 / mod;

ull a3 = pre * gold[1] + las * gold[0] + a2 / mod;

ull a4 = dist + pre * gold[0] + a3 / mod;

cout << (a4 == b ? 'b' : 'a') << endl;

}}

nim遊戲:

有n堆石子。a b兩個人輪流拿,a先拿。每次只能從一堆中取若干個,可將一堆全取走,但不可不取,拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n及每堆石子的數量,問最後誰能贏得比賽。

#include using namespace std;

int main()

if(ans==0)

printf("b\n");

else

printf("a\n");

}

1072 威佐夫遊戲 威佐夫博弈模板

wythoff game 分割 先取完者贏 威佐夫博弈 每次可以從一堆中取任意個或從2堆中取相同數量的石子,但不可不取 乙個局面,讓你求是先手輸贏 差值 1.618 最小值的話後手贏,否則先手贏 乙個局面,讓你求先手輸贏,假設先手贏的話輸出他第一次的取法 首先討論在兩邊同時取的情況,很明顯兩邊同時取...

博弈 威佐夫博弈

有兩堆各若干個物品,兩個人輪流從某一堆或同時從兩堆中取同樣多的物品,規定每次至少取乙個,多者不限,最後取光著得勝。奇異局勢的性質 1.任何自然數都包含在乙個且僅有乙個奇異局勢中 2.任何操作都可以將奇異局勢變為非奇異局勢 3.採用適當的方法,可以將非奇異局勢變為奇異局勢。所以面對非奇異局勢,先手必勝...

威佐夫博弈

威佐夫博奕 wythoff game 有兩堆各若干個物品,兩個人輪流從某一堆或同 時從兩堆中取同樣多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。這種情況下是頗為複雜的。我們用 ak,bk ak bk k 0,1,2,n 表示 兩堆物品的數量並稱其為局勢,如果甲面對 0,0 那麼甲已經輸了,...