演算法與資料結構 博弈論(高階篇之SG博弈)

2021-10-02 23:10:25 字數 2339 閱讀 8002

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顆,那麼無論接下來的人怎麼取,都會出現前面這種情況,所以接下來取的人一定會輸 如果剩下...

資料結構與演算法之小白高階

作為乙個馬上要面對實習的大學生,我深知自己的知識水平和能力的有限,所以準備從現在開始主攻資料結構與演算法,雖然之前也有過接觸,但是沒有系統 全面的了解過,作為面試與工作中必備的重要技能,學好資料結構與演算法是非常重要的。所以我會與大家一起分享每天學習的經驗所得,希望每乙個奮鬥在這條路上的朋友都會達到...