討論胡牌之前先假設有一幅可以胡牌的牌
一萬、一萬、二萬、二萬、二萬、三萬、三萬、三萬、四萬、四萬、四萬、七條、八條、九條;
判斷這一副牌是胡牌不難,但是想判斷可以胡的方式就要用到一種排列組合演算法——「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...