面試 麻將胡牌 位元組跳動 遊戲規則 遞迴

2021-10-08 05:59:05 字數 1898 閱讀 5056

【位元組跳動實習面試 2019-01-07】

給定長度為14的整型陣列,判斷是否胡牌2 + 3*4   dd + (abc or aaa) * 4

範圍 1~9之間代表數字1~9

形如 111 222 333 456 77 返回true

形如 111 223 345 67 999 返回true

形如 111 222 333 457 99 返回false

把規則拆分開,分開討論,不可能乙個式子包括所有情況的

from collections import counter

defis_agari

(tehai)

->

bool

:def

is_agari_impl

(tehai_cnt: counter, rest_tiles:

int)

->

bool

:""" args:tehai_cnt: 各種牌的枚數資訊rest_tiles: 剩餘手牌張數 """

if rest_tiles ==0:

return

true

min_tile =

min(

filter

(lambda x: tehai_cnt[x]

, tehai_cnt.keys())

)# 拆刻子(aaa)

if tehai_cnt[min_tile]

>=3:

tehai_cnt[min_tile]-=3

if is_agari_impl(tehai_cnt, rest_tiles -3)

:return

true

tehai_cnt[min_tile]+=3

# 拆雀頭(對子,即dd)

if rest_tiles %

3and tehai_cnt[min_tile]

>=2:

tehai_cnt[min_tile]-=2

if is_agari_impl(tehai_cnt, rest_tiles -2)

:return

true

tehai_cnt[min_tile]+=2

# 拆順子(abc)

if(min_tile <

27and min_tile %

9<

7and tehai_cnt[min_tile +1]

and tehai_cnt[min_tile +2]

):tehai_cnt[min_tile]-=1

tehai_cnt[min_tile +1]

-=1tehai_cnt[min_tile +2]

-=1if is_agari_impl(tehai_cnt, rest_tiles -3)

:return

true

tehai_cnt[min_tile +2]

+=1tehai_cnt[min_tile +1]

+=1tehai_cnt[min_tile]+=1

return

false

return is_agari_impl(counter(tehai)

,len

(tehai))if

len(tehai)%3

==2else

false

if __name__ ==

'__main__'

:# tehai = [0,0,0,1,2,3,4,5,6,7,8,8,8,8]

tehai =[1

,1,1

,2,3

,4,2

,3,4

,5,6

,8,9

,9]

麻將胡牌判決

胡牌有以下幾種情況 1 乙個對子 4組 3個相同的牌或者順子。只有m s p是可以構成順子的。東西南北這樣的牌沒有順子。2 7個不同的對子。3 1m,9m,1p,9p,1s,9s,1c,2c,3c,4c,5c,6c,7c.這13種牌每種都有,而且僅有這13種牌。肯定是有一種2張。其他的1張。首先是列...

麻將胡牌判決

就是給了13張牌。問增加哪些牌可以胡牌。胡牌有以下幾種情況 1 乙個對子 4組 3個相同的牌或者順子。只有m s p是可以構成順子的。東西南北這樣的牌沒有順子。2 7個不同的對子。3 1m,9m,1p,9p,1s,9s,1c,2c,3c,4c,5c,6c,7c.這13種牌每種都有,而且僅有這13種牌...

麻將胡牌演算法

majiang algorithm是帶多張鬼牌的通用胡牌演算法,採用查表方式,簡單高效。在生成表的階段,時間是不值錢的,所以生成方法我們可以任意窮舉。首先分為普通 風 箭三張表。窮舉出所有的key,比如普通表,就是000000000 444420000,因為每一種牌最大4張,且總和不超過14張牌。對...