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乘起來,判斷奇偶,然後輸出即可,第一次做的時候,沒反應過來就過了,現在補充一下...