|
首先各列元素进行全排列,
然后进行香川多列组合,得到最后结果。
所以一共需要两个不同的递归过程:
- Dim sj(), jg(), j&, k&, n&
- Sub test() 'by kagawa 2015/5/18
- Dim ar, i&, m&, s$, cnt&, tms#
- tms = Timer
- ar = [a1].CurrentRegion
- n = UBound(ar, 2)
-
- cnt = 1
- ReDim sj(1 To n, -1 To 0)
- For j = 1 To n
- s = ""
- For i = 1 To UBound(ar)
- If ar(i, j) = "" Then Exit For
- s = s & ar(i, j) '各列元素合并为字符串s
- Next
- k = WorksheetFunction.Fact(Len(s)) '计算各列排列结果数
- sj(j, 0) = s: sj(j, -1) = k
- If k > m Then m = k '得到各列排列结果的最大值
- cnt = cnt * k
- Next
-
- ReDim Preserve sj(1 To n, -1 To m) '按最大值m定义数组sj存放各列排列结果
- For j = 1 To n
- k = 0: Call dgPL("", CStr(sj(j, 0)), Len(sj(j, 0))) '调用全排列递归过程
- Next
-
- ReDim jg(1 To cnt, 1 To 1) '定义存放香川多列组合的结果数组
- k = 0: Call dgMN("", 1) '调用香川多列组合递归过程
-
- MsgBox Format(Timer - tms, "0.000s ") & k
- [a1].Offset(, n + 1).CurrentRegion = ""
- [a1].Offset(, n + 1).Resize(k) = jg '输出结果
- End Sub
- Sub dgPL(x$, y$, n&) '各列元素进行全排列交换的递归过程
- Dim i&
- If n = 1 Then k = k + 1: sj(j, k) = x & y: Exit Sub
- For i = 1 To n
- Call dgPL(x & Mid(y, i, 1), Left(y, i - 1) & Right(y, n - i), n - 1)
- Next
- End Sub
- Sub dgMN(s$, j&) '各列排列结果进行香川多列组合的递归过程
- Dim i&
- For i = 1 To sj(j, -1)
- If j < n Then Call dgMN(s & sj(j, i), j + 1) Else k = k + 1: jg(k, 1) = s & sj(j, i)
- Next
- End Sub
复制代码 |
评分
-
1
查看全部评分
-
|