麻將演算法(五)胡牌之M選N

2021-08-09 18:39:58 字數 1435 閱讀 3518

討論胡牌之前先假設有一幅可以胡牌的牌

一萬、一萬、二萬、二萬、二萬、三萬、三萬、三萬、四萬、四萬、四萬、七條、八條、九條;

判斷這一副牌是胡牌不難,但是想判斷可以胡的方式就要用到一種排列組合演算法——「m選n」:

把手牌以「同牌」和「連牌」的形式儲存到list裡,找出一共可以存放的若干種方式,最終選擇出來的方式的數量和牌值一

定等於原來手中牌的數量和手中牌的牌值,從m種方式中選擇n種方式,這「n」種方式就是可以胡牌的幾種方式。

m選n的大致思路是:

(一)m:一共有多少個方式用0表示;

(二)n:一共要選擇多少個方式用1表示;

(三)將m、n進行初始化操作;

(四)然後從左到右掃瞄陣列元素值的「10」組合,找到第乙個「10」組合後將其變為「01」組合

(五)同時將其左邊的所有「1」全部移動到陣列的最左端;

(六)當n個「1」全部移動到最右端時,就已經選擇完畢;

如下圖所示:

1   1   1   0   0   //1,2,3     

1   1   0   1   0   //1,2,4     

1   0   1   1   0   //1,3,4     

0   1   1   1   0   //2,3,4     

1   1   0   0   1   //1,2,5     

1   0   1   0   1   //1,3,5     

0   1   1   0   1   //2,3,5     

1   0   0   1   1   //1,4,5     

0   1   0   1   1   //2,4,5     

0   0   1   1   1   //3,4,5  

思路說完上**,看著**再來一次:

public static void swap(ref int my, ref int other)  //這是乙個變換兩個為數字的方法(int 為值型別,想改

變傳進來數字的值,使用ref)

static listgetcombinenfromm(int iselcetcount, int icount)  //從所有胡牌方式中選出來我們需要的胡

牌方式 iselcetcount=4-碰的次數(還需要胡牌的方式),icount=一共多少種

else

comnbinelist.add((int)comnbine.clone());

for (int i = 0; i < icount - 1; ++i)

for (int j = 0; j < i; j++)  //移位(將i左邊的1全部移動到最左端)

comnbinelist.add((int)comnbine.clone());

i = -1;}}

}return comnbinelist;

}

麻將胡牌演算法

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

麻將胡牌演算法 C

這裡只介紹普通的麻將胡牌演算法,也就是7個對子或者 1個對子 3 n n 三個順子或者三個一樣的 其中字牌 東南西北中發白 不能算順子。首先對於每張牌 它有牌的的數字 1 9,牌的種類 萬條筒以及字 所以先封裝乙個牌的包裝類。如果要和伺服器互動的話就應該給這個類序列化 即加上system.seria...

麻將無賴子胡牌演算法

include typedef unsigned char uchar typedef unsigned short ushort define max count 14 define wik null 0 define wik chi hu 0x40 uchar analysedeletepair...