大神鏈
我們先用乙個簡單的例子引入:
考慮有這樣乙個遊戲,有3堆火柴,分別有a,b,c根,記為(a,b,c)
每次乙個遊戲者可以從任意一堆中拿走至少一根火柴,也可以整堆拿走,但是不能從多堆火柴中拿
無法拿火柴的人輸
這個遊戲就叫做nim遊戲
舉個例子,假設a=1,b=2,c=3,若你先拿,你會怎麼辦呢?
方案一:(1,2,3)—->(0,2,3),然而只要對手把狀態變成(0,2,2),你就輸定了(因為對手可以模仿你的操作)
方案二:(1,2,3)—->(1,0,3)或者(1,2,3)—->(1,2,0),這樣的狀態和方案一是一樣的
方案三:(1,2,3)—->(1,2,2)或者(1,2,3)—->(1,2,1)或者(1,2,3)—->(1,2,0),這樣的狀態下,你還是會輸
至此,我們討論了所有6種可能的拿法,都是你輸
所以我們說(1,2,3)是乙個先手必敗狀態,簡稱必敗狀態
而(1,2,3)的所有後繼狀態都是先手必勝狀態
這裡我們提出兩個規則:
規則一下面我們介紹一些經典遊戲:ch乙個狀態是必敗態當且僅當ta的所有後繼都是必勝狀態
規則二
乙個狀態是必勝態當且僅當ta至少有乙個後繼是必敗狀態
omp!
遊戲有乙個m∗n
的棋盤,每次可以取走乙個方格並拿掉ta右邊和上面的所有方格
拿到左下角的格仔(1,1)者輸
分析:本題的結論有一點偏激:除了(1,1)是先手必敗之外,其他情況都是先手必勝
我們可以用反證法:如果後手有必勝狀態,使得無論先手取哪個格仔,後手都可以獲得勝利
那麼現在假設先手取得最右上角的石子(m,n),接下來通過某種取法使得自己搶先進入必勝狀態
但實際上,先手第一次就可以取得和後手一樣的狀態,搶先進入必勝狀態
約數遊戲
有1到n個數字,兩個人輪流選擇乙個數,並且把ta和ta的所有約數刪去
擦去最後乙個數的人贏
分析:這道題和ch
omp!
遊戲有異曲同工之妙
假如先手第一次取了1,接下來後手通過某種取法使得自己搶先進入必勝狀態
實際上,先手第一次就可以取得和後手一樣的狀態,搶先進入必勝狀態
現在我們回到一開始的ni
m 遊戲 l.
bout
on在1902
年提出了這樣乙個定理: 狀態(
x1,x
2,x3
) 是必敗態,當且僅當x1
xorx
2xor
x3=0
,這個異或和就叫做遊戲的ni
m 和
我們要想辦法這條定理擴充套件到所有的博弈問題上
下面我們就介紹乙個很好的工具:sg函式和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(
sg(a
),sg
(b),
sg(c
)) s
g 函式的終態為sg
(x)=
0 ,當且僅當
x 為必敗點時
遊戲和的sg
函式等於各個遊戲sg
函式的ni
m 和
這樣就可以將每乙個子遊戲分而治之,從而簡化了問題 而b
outo
n 定理就是sp
ragu
e−gr
undy
定理在ni
m 遊戲中的直接應用,因為單堆的ni
m 遊戲sg
函式滿足 sg
(x)=
x 我們可以通過乙個例題來理解一下:
翻棋子遊戲
乙個棋盤上每個格仔有乙個棋子,每次操作可以隨便選擇乙個朝上的棋子(x
,y) ,
選擇乙個形如(x
,b) 或(a
,y) (其中
ba<
x ),把兩個棋子一起翻過來,無法操作的人輸
分析:把座標為(x,y)的棋子看做大小分別為
x 和
y的兩堆火柴,則本題轉化為了經典的ni
m 遊戲
除法遊戲乙個n
∗m的矩陣,每個元素均為2~10000之間的正整數
兩個遊戲者輪流操作,每次可以選一行中的1個或多個大於1的整數,把ta們中的每個數都變成ta的某個真因子
比如12可以變成1,2,3,4,6中的乙個
不能操作的輸(換句話說,如果在誰操作之前,在矩陣中的所有數都是1,則ta輸)
分析:考慮把每個數素因數分解
比如說12=2
∗3∗3
,那麼「變成他的素因數」就等價於拿掉ta的乙個或多個素因子
如果我們把每個數的乙個素因子看成一塊石子,每個數看成一堆石子
則本題和ni
m 遊戲就完全等價了
取石子問題
有1堆n個的石子,每次只能取個石子,先取完石子者勝利,那麼各個數的sg值為多少?
sg[0]=0,f=,
x=1 時,可以取走1 - f個石子,剩餘個,所以 sg[1] = mex= mex = 1
x=2 時,可以取走2 - f個石子,剩餘個,所以 sg[2] = mex= mex = 0
x=3 時,可以取走3 - f個石子,剩餘個,所以 sg[3] = mex = mex =1
x=4 時,可以取走4- f個石子,剩餘個,所以 sg[4] = mex = mex = 2
x=5 時,可以取走5 - f個石子,剩餘個,所以sg[5] = mex =mex = 3
以此類推…..
x 012
3456
78....sg[x] 010
1232
01....
由此我們就可以得到sg函式值求解步驟:
int f[n],sg[n],s[n];
//f[n]:當前狀態的改變方式,n為方式的種類,f[n]要在getsg之前先預處理
//sg:0~n的sg函式值
//s:為x後繼狀態的集合
void getsg(int n)
}}
sg函式和sg定理
下面這篇解釋得很清楚。單個遊戲 sg 0 0 sg值為0的有且只有必敗態 sg x mex sg y x的所有後繼狀態中 第乙個不能達到的sg值,則x可到達sg為0 sg x 1的狀態 組合遊戲 可將sg值看作為石子數,則轉化為nim取石子遊戲,總遊戲的勝負由sg的異或和決定。hdu1848 1 i...
博弈 SG函式和SG定理
在介紹sg函式和sg定理之前我們先介紹介紹必勝點與必敗點吧.必勝點和必敗點的概念 p點 必敗點,換而言之,就是誰處於此位置,則在雙方操作正確的情況下必敗。n點 必勝點,處於此情況下,雙方操作均正確的情況下必勝。必勝點和必敗點的性質 1 所有終結點是 必敗點 p 我們以此為基本前提進行推理,換句話說,...
SG函式和SG定理 詳解
在介紹sg函式和sg定理之前我們先介紹介紹必勝點與必敗點吧.必勝點和必敗點的概念 p點 必敗點,換而言之,就是誰處於此位置,則在雙方操作正確的情況下必敗。n點 必勝點,處於此情況下,雙方操作均正確的情況下必勝。必勝點和必敗點的性質 1 所有終結點是 必敗點 p 我們以此為基本前提進行推理,換句話說,...