1. 程式人生 > >麻將胡牌演算法python版

麻將胡牌演算法python版

#coding:utf8 ##################### #作者:skillart #bolg:http://blog.csdn.net/skillart/article/details/40422885 # ##################### # 資料格式:型別=value/100, 數值=value%10 # [111-119] 萬 # [121-129] # [131-139] # [141-149]   # [211-219] 餅 # [221-229] # [231-239] # [241-249]   # [311-319] 條 # [321-329] # [331-339] # [341-349]   # [411-417] 東西南北中發白 # [421-427] # [431-437] # [441-447] import random g_NeedHunCount = 4 g_mjsArr = [     101, 102, 103, 104, 105, 106, 107, 108, 109, #萬     101, 102, 103, 104, 105, 106, 107, 108, 109,     101, 102, 103, 104, 105, 106, 107, 108, 109,     101, 102, 103, 104, 105, 106, 107, 108, 109,     201, 202, 203, 204, 205, 206, 207, 208, 209, #餅     201, 202, 203, 204, 205, 206, 207, 208, 209,     201, 202, 203, 204, 205, 206, 207, 208, 209,     201, 202, 203, 204, 205, 206, 207, 208, 209,     301, 302, 303, 304, 305, 306, 307, 308, 309, #條     301, 302, 303, 304, 305, 306, 307, 308, 309,     301, 302, 303, 304, 305, 306, 307, 308, 309,     301, 302, 303, 304, 305, 306, 307, 308, 309,     401, 402, 403, 404, 405, 406, 407, # 東 西 南 北 中 發 白     401, 402, 403, 404, 405, 406, 407,     401, 402, 403, 404, 405, 406, 407,     401, 402, 403, 404, 405, 406, 407 ] # end   # [ 測試使用 g_testMjsArr = [     101, 101, 101, 101, 102, 102, 104, 201, 103,     103, 103, 103, 104, 104, 102, 104, 105, 105,     105, 105, 106, 106, 106, 106, 107, 107, 107,     107, 108, 108, 108, 108, 109, 109, 109, 109,     201, 202, 203, 204, 204, 202, 203, 205, 201,     202, 203, 204, 201, 202, 203, 204, 205, 206,     207, 208, 206, 102, 207, 208, 205, 206, 207,     208, 205, 206, 207, 208, 209, 209, 209, 209,     301, 302, 303, 304, 301, 302, 303, 304, 301,     302, 303, 304, 301, 302, 303, 304, 305, 306,     307, 308, 305, 306, 307, 308, 305, 306, 307,     308, 305, 306, 307, 308, 309, 309, 309, 309,     401, 402, 403, 404, 405, 406, 407, # 東 西 南 北 中 發 白     401, 402, 403, 404, 405, 406, 407,     401, 402, 403, 404, 405, 406, 407,     401, 402, 403, 404, 405, 406, 407 ] def getTestMjs():     mjArr = []     mjArr.extend(g_testMjsArr)     return mjArr # 測試使用 ]   # 獲得一副牌並混亂牌 def randomMjs():     mjArr = []     mjArr.extend(g_mjsArr)     i = random.randint(1, 5 )     while i > 0:         random.shuffle( mjArr )         i = i - 1     return mjArr   # 判斷是否有效 def isValidMj( mj ):     itype = mj / 100     clr = mj % 100 / 10 # 忽略該欄位,僅用於判別有效     value = mj % 10     if itype == 1 or itype == 2 or itype == 3:         if value < 1 or value > 9 or clr != 0:             return False         else:             return True     elif itype == 4:         if value < 1 or value > 7 or clr != 0:             return False         else:             return True     else:         return False   # 獲得混 def getHunMj(fanMj):     t = fanMj / 100     v = fanMj % 10     if t == 4:         v = v+1         if v > 7:             v = 1     elif t>0 and t<5:         v = v+1         if v > 9:             v = 1     return t*100 + v   def sortArr(arr):     if len(arr) == 0:         return     arr.sort( None, key=lambda v:v%10 )   def seprateArr( mjArr, hunMj ):     reArr = [[],[],[],[],[]]     ht = hunMj / 100     hv = hunMj % 10     for mj in mjArr:         t = mj / 100         v = mj % 10         if ht == t and hv == v:             t = 0         reArr[t].append( mj )         sortArr( reArr[t] )     return reArr   def test3Combine( mj1, mj2, mj3 ):     t1, t2, t3 = mj1/100, mj2/100, mj3/100     # 牌型不同不能組合     if t1 != t2 or t1 != t3:         return False     v1, v2, v3 = mj1%10, mj2%10, mj3%10     # 重牌     if v1 == v2 and v1 == v3:         return True     if t3 == 4:         return False     if (v1+1) == v2 and (v1+2) == v3:         return True     return False     def getModNeedNum(arrLem,isJiang):     if arrLem <=0:         return 0     modNum = arrLem % 3     needNumArr = [0,2,1]     if isJiang:         needNumArr = [2,1,0]     return needNumArr[modNum]   def getNeedHunInSub( subArr, hNum ):     global callTime     callTime += 1       global g_NeedHunCount     if g_NeedHunCount == 0:         return       lArr = len(subArr)       if hNum + getModNeedNum(lArr,False) >= g_NeedHunCount:         return       if lArr == 0:         g_NeedHunCount = min( hNum, g_NeedHunCount )         return     elif lArr == 1:         g_NeedHunCount = min( hNum+2, g_NeedHunCount )         return     elif lArr == 2:         t = subArr[0] / 100         v0 = subArr[0] % 10         v1 = subArr[1] % 10         if t == 4: # 東南西北中發白(無順)             if v0 == v1:                 g_NeedHunCount = min( hNum+1, g_NeedHunCount )                 return         elif  (v1-v0) < 3:             g_NeedHunCount = min( hNum+1, g_NeedHunCount )         return     elif lArr >= 3: # 大於三張牌         t  = subArr[0] / 100         v0 = subArr[0] % 10         v2 = subArr[2] % 10           #第一個和另外兩個一鋪         arrLen = len(subArr)         for i in range( 1, arrLen ):             if hNum + getModNeedNum(lArr-3,False)  >= g_NeedHunCount:                 break             v1 = subArr[i] % 10             #13444   134不可能連一起             if v1 - v0 > 1:                 break             if ( i+2 )  < arrLen:                 if ( subArr[i+2]%10 ) == v1:                     continue             if i+1 < arrLen:                 tmp1, tmp2, tmp3 = subArr[0],subArr[i], subArr[i+1]                 if test3Combine( tmp1, tmp2, tmp3 ):                     subArr.remove( tmp1 )                     subArr.remove( tmp2 )                     subArr.remove( tmp3 )                     subLen = len(subArr)                     getNeedHunInSub(subArr, hNum)                     subArr.append( tmp1 )                     subArr.append( tmp2 )                     subArr.append( tmp3 )                     sortArr( subArr )           # 第一個和第二個一鋪         v1 = subArr[1] % 10         if hNum + getModNeedNum(lArr-2,False) +1 < g_NeedHunCount:             if t == 4: # 東南西北中發白(無順)                 if v0 == v1:                     tmp1 = subArr[0]                     tmp2 = subArr[1]                     subArr.remove( tmp1 )                     subArr.remove( tmp2 )                     getNeedHunInSub(subArr, hNum+1)                     subArr.append( tmp1 )                     subArr.append( tmp2 )                     sortArr( subArr )               else:                 arrLen= len(subArr)                 for i in range( 1, arrLen ):                     if hNum + getModNeedNum(lArr-2,False) +1  >= g_NeedHunCount:                         break;                     v1 = subArr[i] % 10                     #如果當前的value不等於下一個value則和下一個結合避免重複                     if (i+1) != arrLen:                         v2 = subArr[i+1] % 10                         if v1 == v2:                             continue                     mius = v1 - v0                     if  mius < 3:                         tmp1 = subArr[0]                         tmp2 = subArr[i]                         subArr.remove( tmp1 )                         subArr.remove( tmp2 )                         getNeedHunInSub(subArr, hNum+1)                         subArr.append( tmp1 )                         subArr.append( tmp2 )                         sortArr( subArr )                         if mius >= 1:                             break                     else:                         break           # 第一個自己一鋪         if  hNum + getModNeedNum(lArr-1,False)+2 < g_NeedHunCount:             tmp = subArr[0]             subArr.remove( tmp )             getNeedHunInSub( subArr, hNum+2 )             subArr.append( tmp )             sortArr( subArr )     else:         return   def test2Combine( mj1, mj2 ):     t1, t2 = mj1 / 100, mj2 / 100     v1, v2 = mj1 % 10, mj2 % 10     if t1 == t2 and v1 == v2:         return True     return False   def canHu( hunNum, arr ):     global g_NeedHunCount     tmpArr = []     tmpArr.extend(arr)     arrLen  = len( tmpArr )     if arrLen <= 0:         if hunNum >= 2:             return True         return False       if hunNum < getModNeedNum(arrLen,True):         return False       for i in range( arrLen ):         if i == (arrLen - 1 ):# 如果是最後一張牌             if hunNum > 0:                 tmp = tmpArr[i]                 hunNum = hunNum - 1                 tmpArr.remove( tmpArr[i] )                 g_NeedHunCount = 4                 getNeedHunInSub(tmpArr, 0)                 if g_NeedHunCount <= hunNum:                     # print 'type:',tmp/100, 'value', tmp%10, 1                     return True                 hunNum = hunNum +1                 tmpArr.append(tmp)                 sortArr(tmpArr)         else:             if ( i+2 ) == arrLen or (tmpArr[i]%10) != (tmpArr[i+2]%10):                 if test2Combine( tmpArr[i], tmpArr[i+1] ):                     tmp1 = tmpArr[i]                     tmp2 = tmpArr[i+1]                     tmpArr.remove( tmp1 )                     tmpArr.remove( tmp2 )                     g_NeedHunCount = 4                     getNeedHunInSub(tmpArr, 0)                     if g_NeedHunCount <= hunNum:                         # print 'type:',tmp1/100, 'value', tmp1%10, 2                         return True                     tmpArr.append( tmp1 )                     tmpArr.append( tmp2 )                     sortArr(tmpArr)             if hunNum>0 and (tmpArr[i]%10) != (tmpArr[i+1]%10):                 hunNum = hunNum -1                 tmp = tmpArr[i]                 tmpArr.remove( tmp )                 g_NeedHunCount = 4                 getNeedHunInSub(tmpArr, 0)                 if g_NeedHunCount <= hunNum:                     # print 'type:',tmp/100, 'value', tmp%10, 3                     return True                 hunNum = hunNum +1                 tmpArr.append( tmp )                 sortArr( tmpArr )     return False   # 判斷胡牌 def testHu( mj, mjArr, hunMj ):     global g_NeedHunCount     tmpArr = []     tmpArr.extend(mjArr) # 建立一個麻將陣列的copy     if mj != 0:         tmpArr.append( mj ) # 插入一個麻將     sptArr = seprateArr( tmpArr, hunMj )     curHunNum = len( sptArr[0] )     if curHunNum > 3:         return True       ndHunArr = [] # 每個分類需要混的陣列     for i in range( 1, 5 ):         g_NeedHunCount = 4         getNeedHunInSub( sptArr[i], 0 )         ndHunArr.append(g_NeedHunCount)     isHu = False     # 將在萬中     #如果需要的混小於等於當前的則計算將在將在萬中需要的混的個數     ndHunAll = ndHunArr[1] + ndHunArr[2] + ndHunArr[3]     if ndHunAll <= curHunNum:         hasNum = curHunNum - ndHunAll         isHu = canHu( hasNum, sptArr[1] )         if isHu:             return True     # 將在餅中     ndHunAll = ndHunArr[0] + ndHunArr[2] + ndHunArr[3]     if ndHunAll <= curHunNum:         hasNum = curHunNum - ndHunAll         isHu = canHu( hasNum, sptArr[2] )         if isHu:             return True     # 將在條中     ndHunAll = ndHunArr[0] + ndHunArr[1] + ndHunArr[3]     if ndHunAll <= curHunNum:         hasNum = curHunNum - ndHunAll         isHu = canHu( hasNum, sptArr[3] )         if isHu:             return True     # 將在風中     ndHunAll = ndHunArr[0] + ndHunArr[1] + ndHunArr[2]     if ndHunAll <= curHunNum:         hasNum = curHunNum - ndHunAll         isHu = canHu( hasNum, sptArr[4] )         if isHu:             return True     return False   def testGang( mj, mjArr, hunMj ):     t = mj / 100     v = mj % 10     c = 0     tmpArr = []     tmpArr.extend(mjArr)     sptArr = seprateArr( tmpArr, hunMj )     if len( sptArr[t] ) < 2:         return False     else:         for tmj in sptArr[t]:             if ( tmj%10 ) == v:                 c = c+1         if c == 3:             return True   def testPeng( mj, mjArr, hunMj ):     t = mj / 100     v = mj % 10     c = 0     tmpArr = []     tmpArr.extend(mjArr)     sptArr = seprateArr( tmpArr, hunMj )     if len( sptArr[t] ) < 2:         return False     else:         for tmj in sptArr[t]:             if ( tmj%10 ) == v:                 c = c+1         if c == 2 or c == 3:             return True   def analyzeAnGang( mjArr, hunMj ):     result = []     tmpArr = []     tmpArr.extend(mjArr)     sptArr = seprateArr( tmpArr, hunMj )     for i in range(len(sptArr)):         subLen = len( sptArr[i] )         if subLen < 4:             continue         else:             for j in range(subLen):                 if ( subLen - 1 - j )<3:                     break                 if (sptArr[i][j]%10) == (sptArr[i][j+1]%10) and \                                 (sptArr[i][j+1]%10) == (sptArr[i][j+2]%10) and \                                 (sptArr[i][j+2]%10) == (sptArr[i][j+3]%10):                     result.append( sptArr[i][j] )     return result   def rmSample( mj, mjArr, cnt=0 ):     i = cnt     j = 0     while i>0:         if mjArr.count( mj ):             mjArr.remove( mj )             j += 1         i -= 1     return j     def getJiangNeedHum(arr):     global g_NeedHunCount     minNeedNum = 4     tmpArr = []     tmpArr.extend(arr)     arrLen  = len( tmpArr )     if arrLen <= 0:         return 2     for i in range( arrLen ):         if i == (arrLen - 1 ):# 如果是最後一張牌             tmp = tmpArr[i]               tmpArr.remove( tmpArr[i] )             g_NeedHunCount = 4             getNeedHunInSub(tmpArr, 0)             minNeedNum = min(minNeedNum,g_NeedHunCount+1)               tmpArr.append(tmp)             sortArr(tmpArr)         else:             if ( i+2 ) == arrLen or (tmpArr[i]%10) != (tmpArr[i+2]%10):                 if test2Combine( tmpArr[i], tmpArr[i+1] ):                     tmp1 = tmpArr[i]                     tmp2 = tmpArr[i+1]                     tmpArr.remove( tmp1 )                     tmpArr.remove( tmp2 )                     g_NeedHunCount = 4                     getNeedHunInSub(tmpArr, 0)                       minNeedNum = min(minNeedNum,g_NeedHunCount)                       tmpArr.append( tmp1 )                     tmpArr.append( tmp2 )                     sortArr(tmpArr)             if (tmpArr[i]%10) != (tmpArr[i+1]%10):                     tmp = tmpArr[i]                 tmpArr.remove( tmp )                 g_NeedHunCount = 4                 getNeedHunInSub(tmpArr, 0)                   minNeedNum = min(minNeedNum,g_NeedHunCount+1)                   tmpArr.append( tmp )                 sortArr( tmpArr )     return minNeedNum     def getTingArr(mjArr,hunMj):     global g_NeedHunCount     global callTime     tmpArr = []     tmpArr.extend(mjArr) # 建立一個麻將陣列的copy     sptArr = seprateArr( tmpArr, hunMj )       ndHunArr = [] # 每個分類需要混的陣列     for i in range( 1, 5 ):         g_NeedHunCount = 4         getNeedHunInSub( sptArr[i], 0 )         ndHunArr.append(g_NeedHunCount)         jaNdHunArr = []#每個將分類需要混的陣列     for i in range(1,5):         jdNeedHunNum = getJiangNeedHum(sptArr[i])         jaNdHunArr.append(jdNeedHunNum)         curHunNum = len( sptArr[0])     tingArr = []     paiArr = [[101,110],[201,210],[301,310],[401,408]]       #是否單調將     isAllHu = False     needNum = 0     for i in range(0,4):         needNum += ndHunArr[i]     if curHunNum - needNum == 1:         isAllHu = True     if isAllHu:         for lis in paiArr:             for x in range(lis[0],lis[1]):                 tingArr.append(x)         return  tingArr         for i in range(0,4):         # if len(sptArr[i+1]) == 0:         #     continue;         # 聽牌是將         needNum = 0         for j in range(0,4):             if(i != j):                 needNum = needNum + ndHunArr[j]           if needNum <= curHunNum:             for k in range(paiArr[i][0],paiArr[i][1]):                 t = [k]                 t.extend(sptArr[i+1])                 sortArr(t)                 if canHu(curHunNum-needNum,t):                     tingArr.append(k)                     # print callTime           # 聽牌是撲         for j in range(0,4):             if(i != j):                 needNum = 0                 for k in range(0,4):                     if(k != i):                         if(k == j):                             needNum += jaNdHunArr[k]                         else:                             needNum += ndHunArr[k]                 if needNum <= curHunNum:                     for k in range(paiArr[i][0],paiArr[i][1]):                         if k not in tingArr:                             t = [k]                             t.extend(sptArr[i+1])                             g_NeedHunCount = 4                             sortArr(t)                             getNeedHunInSub(t, 0 )                             if g_NeedHunCount <= curHunNum - needNum:                                 tingArr.append(k)       if(len(tingArr) > 0) and hunMj not in tingArr:         tingArr.append(hunMj)     return  tingArr;       def getTingNumArr(mjArr,hunMj):     global g_NeedHunCount     global callTime     tmpArr = []     tmpArr.extend(mjArr) # 建立一個麻將陣列的copy     sptArr = seprateArr( tmpArr, hunMj )       ndHunArr = [] # 每個分類需要混的陣列     for i in range( 1, 5 ):         g_NeedHunCount = 4         getNeedHunInSub( sptArr[i], 0 )         ndHunArr.append(g_NeedHunCount)         jaNdHunArr = []#每個將分類需要混的陣列     for i in range(1,5):         jdNeedHunNum = getJiangNeedHum(sptArr[i])         jaNdHunArr.append(jdNeedHunNum)       #給一個混看能不能胡     curHunNum = len( sptArr[0])+1     tingArr = []         #是否單調將     isAllHu = False     needNum = 0     for i in range(0,4):         needNum += ndHunArr[i]     if curHunNum - needNum == 1:         isAllHu = True     if isAllHu:         tingArr.extend(tmpArr)         return  tingArr       for i in range(0,4):         setTmp = set(sptArr[i+1])         for x in setTmp:             t = []             t.extend(sptArr[i+1])             t.remove(x)             # 將             needNum = 0             for j in range(0,4):                 if(i != j):                     needNum = needNum + ndHunArr[j]             if needNum <= curHunNum and x not in tingArr:                 if canHu(curHunNum-needNum,t):                     tingArr.append(x)             # print callTime               # 撲             for j in range(0,4):                 if len(sptArr[j+1]) == 0:                     continue                 if(i != j):                     needNum = 0                     for k in range(0,4):                         if(k != i):                             if(k == j):                                 needNum += jaNdHunArr[k]                             else:                                 needNum += ndHunArr[k]                     if needNum <= curHunNum and x not in tingArr:                         g_NeedHunCount = 4                         getNeedHunInSub(t, 0 )                         if g_NeedHunCount <= curHunNum - needNum:                             tingArr.append(x)                             # print str(callTime) + 10*'-'     return tingArr     import datetime # print 'reqOtherAction +2' # samArr = [111, 111, 111, 111, 214, 214, 214, 214, 315, 315, 315, 315, 118, 119, 119 ] # begin = datetime.datetime.now() # print testHu(112, samArr, 111) # end = datetime.datetime.now() # print end-begin   # samArr = [405,104,104,107,107,203,204,205,207,105,107,108,109] # getTingArr(samArr,405) #testPengGang( 302,samArr, 403 ): # hasGang( samArr, 115 ) #samArr = [101, 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101,101 ] #print testGang(101, samArr, 102)         majmap = {"101":"一萬","102":"二萬","103":"三萬","104":"四萬","105":"五萬","106":"六萬","107":"七萬","108":"八萬","109":"九萬",           "201":"一餅","202":"二餅","203":"三餅","204":"四餅","205":"五餅","206":"六餅","207":"七餅","208":"八餅","209":"九餅",           "301":"一條","302":"二條","303":"三條","304":"四條","305":"五條","306":"六條","307":"七條","308":"八條","309":"九條",           "401":"東風","402":"西風","403":"南風","404":"北風","405":"紅中","406":"發財","407":"白板"}   if __name__ == "__main__":       #####################################     #測試胡牌     # samArr = [111, 111, 111, 111, 214, 214, 214, 214, 315, 315, 315, 315, 118, 119, 119 ]     # print testHu(112, samArr, 111)     #####################################         #####################################     #測試具體能聽哪些牌     samArr = [405,202,203,203,204,205,302,302,303,303]#執行時間:0:00:00.001100 <callTime:83>  [ 一餅 , 四餅 , 二條 , 三條 , 紅中 , ]     # samArr = [405,202,203,203,204,205,301,302,303,303]#執行時間:0:00:00.000721 <callTime:72>  [ 一餅 , 四餅 , 三條 , 紅中 , ]     # samArr = [405,202,203,203,204,205,301,302,302,303]#執行時間:0:00:00.000659 <callTime:72>  [ 一餅 , 四餅 , 二條 , 紅中 , ]     # samArr = [405,203,203,204,205,301,302,302,303,303]#執行時間:0:00:00.000887 <callTime:72>  [ 三餅 , 六餅 , 一條 , 四條 , 紅中 , ]     # samArr = [405,202,203,204,205,301,302,302,303,303]#執行時間:0:00:00.000715 <callTime:59>  [ 二餅 , 五餅 , 一條 , 四條 , 紅中 , ]     # samArr = [405,202,203,203,204,301,302,302,303,303]#執行時間:0:00:00.000797 <callTime:72>  [ 三餅 , 一條 , 四條 , 紅中 , ]     # samArr = [405,104,104,107,107,107,203,204,205,305,307,308,309]#執行時間:0:00:00.000791 <callTime:83>  [ 四萬 , 五條 , 三條 , 四條 , 六條 , 七條 , 紅中 , ]     # samArr = [405,104,104,107,107,107,203,204,205,207,307,308,309]#執行時間:0:00:00.000844 <callTime:85>  [ 四萬 , 七餅 , 二餅 , 五餅 , 六餅 , 八餅 , 九餅 , 紅中 , ]     # samArr = [405,104,105,106,107,108,109,202,202,302,304,306,306]#執行時間:0:00:00.000799 <callTime:88>  [ 二餅 , 三條 , 六條 , 紅中 , ]     # samArr = [405,103,104,105,107,108,109,202,202,302,304,306,306]#執行時間:0:00:00.000859 <callTime:89>  [ 二餅 , 三條 , 六條 , 紅中 , ]     # samArr = [405,103,104,105,106,107,108,202,202,302,304,306,306]#執行時間:0:00:00.000836 <callTime:88>  [ 二餅 , 三條 , 六條 , 紅中 , ]     # #測試兩個癩子的執行時間     # samArr = [405,405,103,105,106,107,108,202,202,302,304,306,306]#執行時間:0:00:00.000955 <callTime:136>  [ 四萬 , 二餅 , 三條 , 六條 , 紅中 , ]     # samArr = [405,405,103,105,106,107,108,201,202,302,304,306,306]#執行時間:0:00:00.000696 <callTime:94>  [ 四萬 , 三餅 , 三條 , 紅中 , ]     # samArr = [405,405,103,105,106,107,108,201,202,302,303,306,306]#執行時間:0:00:00.000790 <callTime:94>  [ 四萬 , 三餅 , 一條 , 四條 , 紅中 , ]     # #測試三個癩子的執行時間     # samArr = [405,405,405,105,106,107,108,202,202,302,304,306,306]#執行時間:0:00:00.001111 <callTime:135>  [ 五萬 , 八萬 , 三萬 , 四萬 , 六萬 , 七萬 , 九萬 , 二餅 , 三條 , 六條 , 紅中 , ]     # samArr = [405,405,405,105,106,107,108,201,202,302,304,306,306]#執行時間:0:00:00.000926 <callTime:118>  [ 五萬 , 八萬 , 三萬 , 四萬 , 六萬 , 七萬 , 九萬 , 三餅 , 三條 , 六條 , 紅中 , ]     # samArr = [405,405,405,105,106,107,108,201,202,302,303,306,306]#執行時間:0:00:00.000949 <callTime:116>  [ 五萬 , 八萬 , 三萬 , 四萬 , 六萬 , 七萬 , 九萬 , 三餅 , 一條 , 四條 , 六條 , 紅中 , ]     # #測試四個癩子的執行時間     # samArr = [405,405,405,405,106,107,108,202,202,302,304,306,306]#執行時間:0:00:00.000607 <callTime:18>  [ 一萬 , 二萬 , 三萬 , 四萬 , 五萬 , 六萬 , 七萬 , 八萬 , 九萬 , 一餅 , 二餅 , 三餅 , 四餅 , 五餅 , 六餅 , 七餅 , 八餅 , 九餅 , 一條 , 二條 , 三條 , 四條 , 五條 , 六條 , 七條 , 八條 , 九條 , 東風 , 西風 , 南風 , 北風 , 紅中 , 發財 , 白板 , ]     # samArr = [405,405,405,405,106,107,108,201,202,302,304,306,306]#執行時間:0:00:00.000390 <callTime:18>  [ 一萬 , 二萬 , 三萬 , 四萬 , 五萬 , 六萬 , 七萬 , 八萬 , 九萬 , 一餅 , 二餅 , 三餅 , 四餅 , 五餅 , 六餅 , 七餅 , 八餅 , 九餅 , 一條 , 二條 , 三條 , 四條 , 五條 , 六條 , 七條 , 八條 , 九條 , 東風 , 西風 , 南風 , 北風 , 紅中 , 發財 , 白板 , ]     # samArr = [405,405,405,405,106,107,108,201,202,302,303,306,306]#執行時間:0:00:00.000758 <callTime:18>  [ 一萬 , 二萬 , 三萬 , 四萬 , 五萬 , 六萬 , 七萬 , 八萬 , 九萬 , 一餅 , 二餅 , 三餅 , 四餅 , 五餅 , 六餅 , 七餅 , 八餅 , 九餅 , 一條 , 二條 , 三條 , 四條 , 五條 , 六條 , 七條 , 八條 , 九條 , 東風 , 西風 , 南風 , 北風 , 紅中 , 發財 , 白板 , ]     #####################################       #####################################     #測試打出哪些牌能聽     # tingNumArr = [405,202,203,203,204,205,301,302,302,303,303]#執行時間:0:00:00.000704 <callTime:48>  [ 二餅 , 三餅 , 五餅 , 一條 , 二條 , 三條 , ]     # tingNumArr = [405,104,104,107,107,107,203,204,205,207,305,307,308,309]#執行時間:0:00:00.000649 <callTime:61>  [ 七餅 , 五條 , ]     # tingNumArr = [405,103,104,105,106,107,108,109,202,202,302,304,306,306]#執行時間:0:00:00.000874 <callTime:82>  [ 三萬 , 六萬 , 九萬 , ]     # #測試兩個癩子     # tingNumArr = [405,405,203,203,204,205,301,302,302,303,303]#執行時間:0:00:00.000424 <callTime:35>  [ 三餅 , 四餅 , 五餅 , 一條 , 二條 , 三條 , ]     # tingNumArr = [405,405,104,107,107,107,203,204,205,207,305,307,308,309]#執行時間:0:00:00.000616 <callTime:63>  [ 四萬 , 七餅 , 五條 , ]     # tingNumArr = [405,405,104,105,106,107,108,109,202,202,302,304,306,306]#執行時間:0:00:00.000551 <callTime:48>  [ 四萬 , 五萬 , 六萬 , 七萬 , 八萬 , 九萬 , 二餅 , 四條 , 六條 , 二條 , ]     # #測試三個癩子     # tingNumArr = [405,405,405,203,204,205,301,302,302,303,303]#執行時間:0:00:00.000493 <callTime:27>  [ 三餅 , 四餅 , 五餅 , 一條 , 二條 , 三條 , ]     # tingNumArr = [405,405,405,107,107,107,203,204,205,207,305,307,308,309]#執行時間:0:00:00.000518 <callTime:36>  [ 七萬 , 三餅 , 四餅 , 五餅 , 七餅 , 五條 , 七條 , 八條 , 九條 , ]     # tingNumArr = [405,405,405,105,106,107,108,109,202,202,302,304,306,306]#執行時間:0:00:00.000522 <callTime:53>  [ 五萬 , 六萬 , 七萬 , 八萬 , 九萬 , 二餅 , 四條 , 六條 , 二條 , ]     # #測試四個癩子     # tingNumArr = [405,405,405,405,204,205,301,302,302,303,303]#執行時間:0:00:00.000422 <callTime:24>  [ 四餅 , 五餅 , 一條 , 二條 , 三條 , ]     # tingNumArr = [405,405,405,405,107,107,203,204,205,207,305,307,308,309]#執行時間:0:00:00.000604 <callTime:35>  [ 七萬 , 三餅 , 四餅 , 五餅 , 七餅 , 五條 , 七條 , 八條 , 九條 , ]     # samArr = [405,405,405,405,106,107,108,109,202,202,302,304,306,306]#執行時間:0:00:00.000678 <callTime:31>  [ 六萬 , 七萬 , 八萬 , 九萬 , 二餅 , 四條 , 六條 , 二條 , ]     # tingNumArr = [407,407,104,105,106,106,306,306,402,402,405,405,406,406]       ##############################     # 測試特殊情況  單一花色重複多次     # tingNumArr = [405,201,201,201,201,202,202,202,202,205,205,205,205,209]#執行時間:0:00:00.006123 <callTime:356>  [ 五餅 , 九餅 , ]     # tingNumArr = [405,405,202,204,205,205,206,206,207,208,208,208,209,306]#執行時間:0:00:00.002929 <callTime:358>  [ 二餅 , 九餅 , 六條 , ]     # samArr = [405,201,201,201,201,201,202,202,202,202,204,204,205]#執行時間:0:00:00.016391 <callTime:1029>  [ 三餅 , 六餅 , 紅中 , ]     # samArr = [405,405,201,201,201,201,202,202,202,202,204,204,209]#執行時間:0:00:00.026671 <callTime:1527>  [ 三餅 , 四餅 , 七餅 , 八餅 , 九餅 , 紅中 , ]     ##############################     samArr = [101,103,103,103,104,104,104,105,106,107,109,405,405]     # tingNumArr = [405,405,103,103,103]     global callTime     callTime = 0     begin = datetime.datetime.now()     # 測試摸哪些牌能胡牌     tingArr = getTingArr(samArr,405)     #測試打哪些牌能聽牌     # tingArr = getTingNumArr(tingNumArr,405)     #測試摸到這張牌是不是能胡牌     # tingArr = {}     # print testHu(209, samArr, 405)     # tingArr = []     # for i in tingNumArr:     #     tmp = []     #     tmp.extend(tingNumArr)     #     tmp.remove(i)     #     getTingNumArr(tmp,405)     end = datetime.datetime.now()     runTime = end-begin     rstr = "執行時間:" + str(runTime) + " <callTime:" + str(callTime) + ">  [ "     for i in range(0,len(tingArr)):         key = str(tingArr[i])         rstr +=  majmap.get(key) + " , "     rstr += "]"     print  rstr