這個遊戲與初始數字有很大的關係:
初始數字是\(4\)的倍數的話是後手必勝,不然就是先手必勝!
策略:
如果現在是\(4\)的倍數,先手拿\(k\)個,後手就拿\(4-k\)個,拿到最後一個的一定是後手!
只要想辦法把現在的數字變成\(4\)的倍數就好了!
另一方毫無反制之力!
這樣就很明顯了吧!
初始數字為\(3\)的倍數是後手勝,
否則是先手勝!
策略:跟前一題很像,但你會發現所有\(2^k\)的數字除以\(3\)都會餘\(1\)或\(2\),所以如果當前剩餘數量是\(3\)的倍數,一方怎麼取,另一方都可以把它取回\(3\)的倍數,就能輕鬆得勝!
可以拿去騙騙人!
前言:
這題的勝利策略已經不像前面那麼顯然,講師如果用大腦跟你玩也不一定得會贏
但不一定要用人腦......
我們是資訊社欸!
(接下來的東西如果覺得有點困難、聽不懂、想睡覺、覺得講師不知道在幹嘛......完全沒有關係,很正常,有興趣、聽得懂的人就聽,也可以再找我討論)
講師要用小畫家講課笑死
實際細節可能有機會再說吧!
大家看看就好
int dp[105][2][2];
void eval(){
for(int i=0;i<100;i++){
if(dp[i][0][0]==-1) dp[i][0][0]=0;
if(dp[i][0][1]==-1) dp[i][0][1]=0;
if(dp[i][1][0]==-1) dp[i][1][0]=0;
if(dp[i][1][1]==-1) dp[i][1][1]=0;
if(dp[i][0][0]==0){
dp[i+1][1][0]=1;
dp[i+2][0][0]=1;
}
if(dp[i][0][1]==0){
dp[i+1][0][0]=1;
dp[i+2][1][0]=1;
}
if(dp[i][1][0]==0){
dp[i+1][1][1]=1;
dp[i+2][0][1]=1;
}
if(dp[i][1][1]==0){
dp[i+1][0][1]=1;
dp[i+2][1][1]=1;
}
}
}
數學家發展了一套分析標準無偏賽局的理論,使用Sprange-Grundy Value,或稱SG Value, nimber, nimsum等等
另外,Sprange-Grundy Theorem表明每一個標準無偏賽局都可以對應到某一種數量的Nim,是標準無偏賽局的終極大定理,以後有機會再聊吧!
Nim的先手必勝條件:將每一堆的數量XOR起來,若此值為0則後手必勝,否則先手必勝。
甚麼是XOR?
將數字以二進位表示,兩個數字的每一位相異則\(1\),否則\(0\)
為什麼?
首先,全部拿完的盤面XOR的值是0
然後我們可以構造出一種方法,使得是0的盤面一定只能變成非0,非0的盤面一定可以變成0。
所以就是好的!
講義中有做法,大家可以參考看看!
Huh?
是不是跟之前的取到3、4的倍數很像?
沒有錯!