/*
1.查表法計算麻將胡牌(原理:
2.跟拆解法對比進行效率比較
*/package main
import (
"fmt"
"time"
"sort"
"os"
"encoding/json"
"log"
"runtime/debug"
"io/ioutil"
"io"
"math/rand"
)type jsondata struct
var g_cards = int
func value2index(value int) int else
}func count(cards int) int
return nums
}func calckey(nums int) int
} else
}} if (b)
} dong := value2index(0x31)
bai := value2index(0x91)
// 字牌
for i := dong; i <= bai; i++
x |= 0x1 << uint32(p)
p++} }
return x
}/* 可以是這種牌型11 111,雖然1不可能有5張,但是可以胡1的.且最多有一種牌是5張牌的組合 */
func checkisvalid(nums int) bool
n := 0
for _, v := range nums
if v == 5
} if n > 1
return true
}func getcardsnum(nums int) int
} return cardsnum
}var printnum = 1
func encode(encodedata map[int]int, cards int) }}
func getpairs() int
} return pairs
}func getgroups() int
} // find three sequence tiles
for i := 2; i < len(g_cards); i++
} }return groups
}/* 將所有胡牌牌型編碼成json資料 */
func encodecards(pairs int, groups int) map[int]int }}
} }fmt.println("-----------------七對----------------")
//七對
l := len(pairs)
temp := make(int, 14)
for i := 0; i < l; i++ }}
}}
} }return encodedata
}func hucards2json()
var jd jsondata
enc := json.newencoder(f)
fmt.println("map len = ", len(m))
for k, v := range m }}
/* 配置檔案只有乙個json資料,如:, 有多個是會出錯 */
func readonejson()
var jd jsondata
err = json.unmarshal(data, &jd)
if err != nil
fmt.println(jd)
}func readalljson() map[int]int
var jd jsondata
dec := json.newdecoder(f)
m := make(map[int]int)
for else if err != nil
m[int(jd.k)] = jd.v
} return m
}var totalcardnums = int
func randcards(allcards int, n int) int
alllen := len(allcards)
var cards = make(int, n)
for i := 0; i < n; i++
return cards
}/* 判斷胡牌-拆解法(3n+2) */
func husplitmethod(nums int, cardsnum int) bool
f := func(n int) bool else
}} return false
} //對子
if cardsnum % 3 == 2
//三張
if f(3)
//順子
loop := int, , }
for j := 0; j < len(loop); j++ else
}} }
return false
}/* 胡牌-七對判斷 */
func huqidui(nums int) bool
} return true
}func ishu(nums int) bool
} return true
}func test1_split(times int, allcards int) }}
func test1(times int, m map[int]int, allcards int) }}
func test2(times int, m map[int]int, allcards int) }}
func test3(times int, m map[int]int, allcards int)
sort.sort(sort.intslice(cards))
nums := count(cards)
key := calckey(nums)
_, ok := m[key]
if ok
if ishu(nums)
} cardstmp := int, //yes
, //no
, //yes
, //no
, //yes
, //no
, //yes
, //no
, //yes
, //no
, //yes
, //no
, //yes
, //no
, //yes
, //yes
, //yes
} for i := 0; i < len(cardstmp) ; i++ else
if ishu(nums) else }}
func benchmark()
begin := time.now().utc().unixnano()
times := 10000000
//test1(times, m, allcards)
test1_split(times, allcards)
//test2(times, m, allcards)
//test3(times, m, allcards)
}func main()
}()fmt.println("start...")
//hucards2json()
benchmark()
fmt.println("end...")
time.sleep(time.duration(3000)*time.second)
}
結論: 查表法效率稍高。拆解法簡單方便,不需要預先生成表,但不穩定:不同的牌型,計算胡牌時消耗時間相差可能很大。查表法需要預先生成表,計算胡牌比較穩定 麻將胡牌演算法
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...