分析策略

怎麼有些人這麼強?

濕婆神與雪山神女

 

這個遊戲與初始數字有很大的關係:

初始數字是\(4\)的倍數的話是後手必勝,不然就是先手必勝!

策略:

如果現在是\(4\)的倍數,先手拿\(k\)個,後手就拿\(4-k\)個,拿到最後一個的一定是後手!

只要想辦法把現在的數字變成\(4\)的倍數就好了!

另一方毫無反制之力!

這樣就很明顯了吧!

賽拉耶佛風土記

有沒有聯想到二進位?

完全無關!

初始數字為\(3\)的倍數是後手勝,

否則是先手勝!

策略:跟前一題很像,但你會發現所有\(2^k\)的數字除以\(3\)都會餘\(1\)或\(2\),所以如果當前剩餘數量是\(3\)的倍數,一方怎麼取,另一方都可以把它取回\(3\)的倍數,就能輕鬆得勝!

很簡單吧!

可以拿去騙騙人!

邊緣鴨嘴獸寶寶

前言:

這題的勝利策略已經不像前面那麼顯然,講師如果用大腦跟你玩也不一定得會贏

但不一定要用人腦......

我們是資訊社欸!

(接下來的東西如果覺得有點困難、聽不懂、想睡覺、覺得講師不知道在幹嘛......完全沒有關係,很正常,有興趣、聽得懂的人就聽,也可以再找我討論)

還記得前面講的勝利失敗條件嗎?

畫圖分析!

講師要用小畫家講課笑死

可以用程式跑!

實際細節可能有機會再說吧!

附code

大家看看就好

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;
		}
	}
}

格物樓地下室邊緣人

這其實是經典的標準無偏賽局:Nim!

數學家發展了一套分析標準無偏賽局的理論,使用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的倍數很像?

沒有錯!

Made with Slides.com