簡單博弈論題目總結

2021-07-23 21:29:34 字數 3603 閱讀 5865

bashgame i 

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

例如n = 3,k = 2。無論a如何拿,b都可以拿到最後1顆石子。

//#include

#include

using

namespace

std;

int n,k,t;

/*巴什博奕(bash game):

必勝策略:設n=(k+1)r+s,先手者拿走s個,使後手者面對(k+1)的倍數的情況.若後手者拿走m個,則先手者再拿走k+1-m個.

*/int main()

else

}return0;}

bashgame ii

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

例如n = 2。a只能拿1顆,所以b可以拿到最後1顆石子。

//#include

#include

using

namespace

std;

int n,t;

int main()

; memset(sg,0,sizeof(sg));

for (int i=1;i<1000;i++)

for (int i=0;i<100;i++)

cout>t;

while(t--)

return0;}

bashgame iii

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

例如n = 3。a只能拿1顆或2顆,所以b可以拿到最後1顆石子。(輸入的n可能為大數)

//#include

#include

using

namespace

std;

int t;

char n[1005];

int main()

; memset(sg,0,sizeof(sg));

for (int i=1;i<1000;i++)

for (int i=0;i<100;i++)

cout>t;

while(t--)

return0;}

bashgame iv

有一堆石子共有n個。a b兩個人輪流拿,a先拿。每次拿的數量最少1個,最多不超過對手上一次拿的數量的2倍(a第1次拿時要求不能全拿走)。拿到最後1顆石子的人獲勝。假設a b都非常聰明,拿石子的過程中不會出現失誤。給出n,問最後誰能贏得比賽。

例如n = 3。a只能拿1顆或2顆,所以b可以拿到最後1顆石子。

//#include

#include

#include

using

namespace

std;

const

int max=1e9+5;

int t,cnt=1;

long

long n,f[100];

/*斐波那契博弈

必敗態構成fibonacci數列

*/int main()

return

0;}

wythoffgame i 

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

例如:2堆石子分別為3顆和5顆。那麼不論a怎樣拿,b都有對應的方法拿到最後1顆。

////證明:

%a8%81

%e4%bd

%90%e5

%a4%ab

%e5%8d

%9a%e5

%bc%88/19858256?fr=aladdin&fromtitle=%e5

%a8%81

%e4%bd

%90%e5

%a4%ab

%e5%8d

%9a%e5

%a5%95&fromid=7139745&type=syn#4

#include

#include

#include

#include

using namespace std;

int t,n,m;

/*威佐夫博弈:

兩個人如果都採用正確操作,那麼面對非奇異局勢,先拿者必勝;反之,則後拿者取勝.

局勢(n,m)(n2.0

*(m-n))時,該局勢為奇異局勢,後拿者必勝.

*/int main()

return

0;}

nimgame

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

例如:3堆石子,每堆1顆。a拿1顆,b拿1顆,此時還剩1堆,所以a可以拿到最後1顆石子。

//#include

#include

#include

#include

using

namespace

std;

int n,ans,a;

/*尼姆博奕:

(bouton's theorem)對於乙個nim遊戲的局面(a1,a2,...,an),它是p-position當且僅當a1^a2^...^an=0,其中^表示異或(xor)運算.

*/int main()

if (ans)

cout

<<"a\n";

else

cout

<<"b\n";

return

0;}

//

//部落格學習:

/*sg函式:

首先定義mex(minimal excludant)運算,這是施加於乙個集合的運算,表示最小的不屬於這個集合的非負整數。例如mex=3、mex=0、mex{}=0。

對於任意狀態 x , 定義 sg(x) = mex(s),其中 s 是 x 後繼狀態的sg函式值的集合。如 x 有三個後繼狀態分別為 sg(a),sg(b),sg(c),那麼sg(x) = mex。 這樣 集合s 的終態必然是空集,所以sg函式的終態為 sg(x) = 0,當且僅當 x 為必敗點p時。

*/#include

#include

using

namespace

std;

const

int max=1e3+5;

int m,n,p,f[50],sg[max],s[max];

void getsg(int n)

}int main()

return

0;}

博弈論題目整理

hdu 1079 暴力pn打錶能過或不太好找的規律 打表比較麻煩 hdu 1525 分析規律 暴力pn打表無法獲得直觀規律,pn打表提交炸時空 hdu 1564 超簡單的規律 無法pn 超水 hdu 1846 巴什模板 超水 hdu 1847 pn找規律 也可直接打表提交 水 hdu 2516 斐波...

博弈論題目集 (持續更新)

巴什博弈 hdu 1846 1 本遊戲是乙個二人遊戲 2 有一堆石子一共有n個 3 兩人輪流進行 4 每走一步可以取走1 m個石子 5 最先取光石子的一方為勝 這個應該比較好推 如果 n m 1 0 後手勝利 否則 先手勝利 include include includeusing namespac...

簡單博弈論

這道題目的意思就是說給你乙個n m的格仔,每次只能從右上角出發,只能往下,往左,往左下角走,每次只能走一步,誰不能走了,誰就輸。其實就是誰先到達左下角,誰就贏了,輸出先手kiki的輸贏情況。這道題的ac 特別簡單,將n和m乘起來,判斷奇偶,然後輸出即可,第一次做的時候,沒反應過來就過了,現在補充一下...