找規律博弈小記(更新)

2021-06-21 01:54:45 字數 2075 閱讀 6637

最近在hdoj上水博弈的題目,在這裡記錄一些小規律。

!!1)

題意:一堆n個石子,每次最多取q個,最少取p個,切最後不少於p個時必須一次性取完。誰後取完者輸。

ps:那麼就是誰先取到剩p個時候就贏了,少於p個的話一定輸,因為必須取完,

如果誰當前遇到0個,贏,大於p小於p+q個是贏,因為先手總是可以想辦法給後手留下p個,讓他不得不拿。

推理發現n個和n-(p+q)輸贏一樣,所以首先可對n%=(p+q)。

**:

#include int main()

return 0;

}

!!2)

題意:n個石子,每次都必須取最少乙個,第一次可以取任意多個,以後取不能超過上次的2倍,誰先取完者勝、

推理發現其正好符合斐波那契數列,為斐波那契數時後手贏,其他先手贏。

還要注意其範圍為2^31次方,可用map容器解決。

#include#include using namespace std;

mapv;

void isit()

}int main()

return 0;

}

!!3)

題意:給定乙個m*n的矩陣,放乙個石子在右上角,每次可以向下,向左,或者下左(對角)移動,誰先移動到右下角勝。

假如m和n有乙個偶數,那麼先手總能夠維持這個偶數直到贏,否則他會輸。

#includeint main()

}

!!4) (奇偶性博弈)

題意:n個硬幣放成一圈,每次最多取連續k個,不能不取。最後取完者勝、

分析:n個硬幣,不論n是奇數偶數,後手總能夠在第一輪把它變成對稱兩部分的狀態,對稱狀態下後手肯定贏。

那麼先手能贏只能是k>=n或者每次只能取乙個且n是奇數。

#include int main()

}

!!5) (階梯博弈)

題意:給出n個盒子,編號1--n,在滿足b>a && (a+b)%2==1 && (a+b)%3==0 && b不為空,的情況下從b中取出任意多個石子放入a總,不能操作者輸,求先手輸贏

分析:首先,要滿足(a+b)%3==0 ,既為3的倍數,又(a+b)%2==1,既為奇數,所以(a+b)為 3 , 6 , 9, 15 , 21...依次+6,發現週期為6

在乙個週期 0 - - 6中

只有(1,2)(3 ,6 )(4,5)滿足條件,那麼就可以從 2 6 5中取出其中石子,變為nim遊戲。所以只要求 i%6 == 0   ||  1 ||  5,的值異或就行

#include int main()

printf("case %d: ",cas);

printf(ans==0?"bob\n":"alice\n");

}return 0;

}

!!6)

題意:給出p=1,博弈雙方每次可以乘以2--9之間的數,誰先達到或超過 n 為勝者,求先手勝敗。

分析:首先1  ---  9 區間先手勝。

10 ---  18 區間,先手輸,先手不論乘以幾,後手總可以乘以乙個數超過。假設乘最小的2,後手乘以 9 ,變為18 超過 。

19 ---- 162 區間,先手勝,先手可以在第一次選擇性乘以乙個數讓對手乘以最大的 9 達不到,然後在下一輪輕鬆達到贏。比如161,首先先手乘以9,後手發現乘以

最大的 9 也才 81 ,那麼他會乘以最小的 2 ,後手乘以 9 ,結果162,超出161.贏!

162 ----324區間,先手輸 ,假如163,先手發現乘以最大的 9 的話局面也不能再第二輪由自己控制,那麼他乘以2,相當於163 / 2 = 82,在區間 19 --- 162中,可得後

手必贏,如果他乘以 9 的話,163 / 9 = 18餘1,相當於19,那麼也是輸。

繼續向下推理發現每次交替乘以 2 或 9 ,那麼程式就很簡單了。

#include int main()

return 0;

}

找規律類博弈(3)

盒子遊戲 描述 有兩個相同的盒子,其中乙個裝了 n 個球,另乙個裝了乙個球。alice 和 bob 發明了乙個遊戲,規則如下 alice 和 bob 輪流操作,alice 先操作。每次操作時,遊戲者先看看哪個盒子裡的球的數目比較少,然後清空這個盒子 盒子裡的球直接扔掉 然後把另乙個盒子裡的球拿一些到...

hdu1564博弈 找規律

include include include include include include include include include include include include include define pi acos 1 define ll long long define mo...

hdu 5708 博弈找規律

題意 乙個無限大的棋盤,一開始在1,1,有三種移動方式,x 1,y x,y 1 x k,y k 最後走到nm不能走了的人算輸。思路。我們看成一開始在 n,m 往1,1,走,所以自然可以從1,1,開始遞推往出,那麼打表程式就出來了。打出表以後我們觀察到k等於1時稍有特殊,其他則與 min cx,cy ...