sg博弈的命名源於sg函式和sg定理,而sg函式的出現則來自於乙個簡單的取石子遊戲:
有1堆n個的石子,每次只能取個石子,先取完石子者勝利,判斷對於不同的n,先手能否取勝?
分析:這個遊戲和巴什博弈的不同在於:
sg博弈中取東西是無規則不連續的,而巴什博弈中取東西則是連續的
因此在討論sg博弈時要複雜很多,在解答sg博弈類題目時我們需要用到sg函式
sg函式:
首先定義mex(minimal excludant)運算,這是施加於乙個集合的運算,表示最小的不屬於這個集合的非負整數。例如mex=3、mex=0、mex{}=0
接下來看一下在1堆n個石子中,隨n變化時sg函式值的變化(注意初始情況下可取石子為f=)
當 n=0 時,先手無法取走任何石子,故sg[0]=0
當 n=1 時,先手可取f個石子,剩餘個,所以 sg[1] = mex = mex = 1
當 n=2 時,先手可取f個石子,剩餘個,所以 sg[2] = mex = mex = 0
當 n=3 時,先手可取f個石子,剩餘個,所以 sg[3] = mex = mex = 1
當n=4 時,先手可取f個石子,剩餘個,所以 sg[4] = mex = mex = 2
當 n=5 時,先手可取f個石子,剩餘個,所以sg[5] = mex =mex = 3
以此類推…
從上面可以看出求sg函式的過程如下:
1.首先定義sg[0]=0,且設可取石子的集合為f=(如上面的f=)
2.對於輸入的n,求出集合 sg = n-f(要求集合sg中均為非負數,如上面n=3時,得到的sg=)
3.sg[i]=mex
根據這樣的流程,最終可得到以下資料:n0
1234
5678
……sg[n]01
0123
201……
上表已經將sg函式的具體值求了出來,現在的問題是,得到的sg函式有什麼用呢?
實際上sg函式為我們指示了先手在某個給定局勢(即給定n)時,其能否取得最終的勝利(假設雙方都採用最佳取法):對於某個給定的i,若sg[i]=0則表示先手必敗,反之必勝
—— 經典題型 ——
hdu1847 good luck in cet-4 everybody!
問題描述
大學英語四級考試就要來臨了,你是不是在緊張的複習?也許緊張得連短學期的acm都沒工夫練習了,反正我知道的kiki和cici都是如此。當然,作為在考場浸潤了十幾載的當代大學生,kiki和cici更懂得考前的放鬆,所謂「張弛有道」就是這個意思。這不,kiki和cici在每天晚上休息之前都要玩一會兒撲克牌以放鬆神經。
「公升級」?「雙扣」?「紅五」?還是「鬥地主」?
當然都不是!那多俗啊~
作為計算機學院的學生,kiki和cici打牌的時候可沒忘記專業,她們打牌的規則是這樣的:
1、 總共n張牌;
2、 雙方輪流抓牌;
3、 每人每次抓牌的個數只能是2的冪次(即:1,2,4,8,16…)
4、 抓完牌,勝負結果也出來了:最後抓完牌的人為勝者;
假設kiki和cici都是足夠聰明(其實不用假設,哪有不聰明的學生~),並且每次都是kiki先抓牌,請問誰能贏呢?
當然,打牌無論誰贏都問題不大,重要的是馬上到來的cet-4能有好的狀態。
good luck in cet-4 everybody!
輸入資料
輸入資料報含多個測試用例,每個測試用例佔一行,包含乙個整數n(1<=n<=1000)。
輸出資料
如果kiki能贏的話,請輸出「kiki」,否則請輸出「cici」,每個例項的輸出佔一行。
樣例輸入13
樣例輸出
kiki
cici
前面在學習巴什博弈的時候就遇到了這道題,當時是找到了乙個規律:當n是3的倍數時先手必敗
現在我們用sg博弈的方法再來解答本題,由於前面已經對sg博弈進行了詳細的分析,這裡就不再贅述
下面直接給出本題的完整**:
#include
#include
using
namespace std;
const
int n=
1005
;int sg[n]
,f[n]
;bool vis[n]
;int
mex(
bool vis)
//定義mex函式
void
create_f()
//構建f集合
void
create_sg()
//構建sg函式
}int
main()
return0;
}
演算法與資料結構 博弈論(高階篇之尼姆博弈)
尼姆博弈 nimm game 有任意堆物品,每堆物品的個數是任意的,雙方輪流從中取物品,每一次只能從一堆物品中取部分或全部物品,最少取一件,取到最後一件物品的人獲勝。分析 我們先來看假設有三堆物品時的情況 這種情況最有意思,它與二進位制有密切關係,我們用 a,b,c 表示某種局勢,則前幾種奇異局勢如...
演算法與資料結構 博弈論
遊戲a 簡單博弈 有兩個遊戲者 a和b。有21顆石子。兩人輪流取走石子,每次可取1 2或3顆。a先取。取走最後一顆石子的人獲勝,即沒有石子可取的人算輸。如果剩下1 2或3顆石子,那麼接下來取的人就能獲勝 如果剩下4顆,那麼無論接下來的人怎麼取,都會出現前面這種情況,所以接下來取的人一定會輸 如果剩下...
資料結構與演算法之小白高階
作為乙個馬上要面對實習的大學生,我深知自己的知識水平和能力的有限,所以準備從現在開始主攻資料結構與演算法,雖然之前也有過接觸,但是沒有系統 全面的了解過,作為面試與工作中必備的重要技能,學好資料結構與演算法是非常重要的。所以我會與大家一起分享每天學習的經驗所得,希望每乙個奮鬥在這條路上的朋友都會達到...