排列组合:01转换法之lua实现

Posted abelmou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排列组合:01转换法之lua实现相关的知识,希望对你有一定的参考价值。

c++ 版连接 https://blog.csdn.net/canguanxihu/article/details/46363375

因为项目用的是lua脚本,看了C++版后自己写了一个lua版本的,原理在c++连接里面博主已经介绍了,我也不重复描述了,直接把代码贴出来

 1 local NewLogic = class("NewLogic")
 2 
 3 local handCardCount = 13
 4 
 5 --随机生成扑克用于测试
 6 function NewLogic:randomMakeCards()
 7 
 8     math.randomseed(os.time())
 9 
10     local cards = {}
11 
12     repeat
13         local card = math.random(52)
14         if not table.indexof(cards,card) then
15             table.insert(cards,card)
16         end
17     until(#cards == handCardCount)
18 
19     return cards
20 end
21 
22 
23 -- o 1 转换排列组合法
24 function NewLogic:combination(cards,cbntNumber)
25     if cbntNumber > #cards then
26         return nil
27     end
28 
29     local assistArray = {}
30     for i = 1,#cards do
31         if i <= cbntNumber then
32             assistArray[i] = 1
33         else
34             assistArray[i] = 0
35         end
36     end
37 
38     local cbntResult = {}
39 
40     local function getResult(astArray,srcArray,cbntResult)
41         local oneOfCombination = {}
42         for k,v in ipairs(astArray) do
43             if v == 1 then
44                 table.insert(oneOfCombination,srcArray[k])
45             end
46         end
47 
48         table.insert(cbntResult,oneOfCombination)
49     end
50 
51     getResult(assistArray,cards,cbntResult)
52 
53     local idx = 1
54     while true do
55         if assistArray[idx + 1] == nil then
56             break
57         end
58 
59         if assistArray[idx] == 1 and assistArray[idx + 1] == 0 then
60             assistArray[idx] = 0
61             assistArray[idx + 1] = 1
62             getResult(assistArray,cards,cbntResult)
63             for i = 1 , idx -1 do
64                 for j = i + 1, idx do
65                     if assistArray[i] < assistArray[j] then
66                         local mid = assistArray[i]
67                         assistArray[i] = assistArray[j]
68                         assistArray[j] = mid
69                     end
70                 end
71             end
72             idx = 1
73         else
74             idx = idx + 1
75         end    
76     end
77 
78     return cbntResult
79 end
80 
81 return NewLogic

 

以上是关于排列组合:01转换法之lua实现的主要内容,如果未能解决你的问题,请参考以下文章

lua之m进制转换为n进制-任意进制转换算法

itertools 排列组合

关于各种排列组合java算法实现方法

离散:常用排列组合模型归纳,DFS代码实现

算法之使用递归求解全排列

如何从一组中继容器中组合片段?