取火柴遊戲,最後取者敗

2022-10-11 08:42:07 字數 1814 閱讀 2250

題意:n堆火柴,2人每次從任意一堆中取至少1個,也可以將整堆取完,取得最後一根火柴的人輸

定義:若所有火柴數異或為0,則該狀態被稱為利他態,用字母t表示;否則, 為利己態,用s表示。

火柴大於等於2的堆 稱為充裕堆 火柴為1 的堆稱為 稱為孤單堆

s t後的數字 代表充裕堆的數量 如果充裕堆大於等於2 就用2表示

s2 s1 t0 先手必勝

t2 s0 先手必敗

s1 (2 1 1)先手 把2變成1 變成s0

s1 (2 1 1 1) 先手把2 拿完 變成s0

t0 (1 1) 偶數個1 先手必勝

s0 (1) 奇數個1 先手必敗

t2 (3 3) 先手必敗 先手拿1個 變成s2 拿2個變成s1 拿3個也是變成s1

s2 (3 4) 先手必勝 先手從4拿走乙個 轉化成t2

t2態,只能轉變為s2態或s1態

s2態可一次轉變為t2態

hdu 1907

n堆火柴,2人每次從任意一堆中取至少1個,也可以將整堆取完,取得最後一根火柴的人輸

sample input23

3 5 111

sample output

john

brother

1 #include2 #include3 #include4

using

namespace

std;

5const

int maxn=101;6

inta[maxn];

7int

main()826

if((ans!=0&&sum1>0)||(ans==0&&sum1==0)) //

s2 s1 t0 先手勝

27 cout<

john

"<

28else

if((ans!=0&&sum1==0)||(ans==0&&sum1>1)) //

s0 t2 後手勝

29 cout<

brother

"<

31return0;

32 }

view code

hdu 2509

題目大意:有n堆蘋果,每堆有mi個。兩人輪流取,每次可以從一堆蘋果中取任意連續個蘋果,最後取光者為輸。fra先下,問是否可以獲勝。 *** 可變為 ** 或 * 或* *(拿中間的)

sample input

22 213

sample output

noyes

1 #include2 #include3 #include4

using

namespace

std;

5const

int maxn=101;6

inta[maxn];

7int

main()824

if((ans!=0&&sum1>0)||(ans==0&&sum1==0)) //

s2 s1 t0 先手勝

25 cout<

yes"

<

26else

if((ans!=0&&sum1==0)||(ans==0&&sum1>1)) //

s0 t2 後手勝

27 cout<

<

2930

3132

return0;

33 }

view code

取火柴遊戲

玩完幾把遊戲後。突然想起了乙個比較老的遊戲 取火柴遊戲!遊戲規則簡單 不需要撿裝備,也沒有危險的空投。emm言歸正傳!有n根火柴,每人每次最多取4根火柴,最少取一根火柴。如果某人取到最後一根火柴,那麼恭喜你,輸了!emmm上 void quhuochai last last user if last...

取火柴遊戲

include include include using namespace std float num1 0 float num2 0 struct treenode class tree float chance treenode ptr void run tree tree1 protect...

取火柴遊戲 Nim博弈

好久之前看的sg函式了 好像就記住乙個nim博弈qwq 第一次啊看的時候很迷,現在感覺可以了qwq 首先我們來看乙個其他的遊戲。以下遊戲只有兩個人參與,且足夠聰明 兩個人在一張圓形的桌子上放等大的盤子,最後乙個無法放盤子的人輸掉比賽 很顯然,先手必勝。為什麼?第乙個人可以將盤子放在桌子的中心。然後只...