对一个行已经凑齐的数组进行列凑数的递归算法,比全排列24*24*24肯定要快。
- Dim ar, h&, z&, cnt&
- Sub test()
- h = 34
- ar = [a1].Resize(4, 4)
- z = 0: cnt = 0: Call dg(h - ar(1, 1), ",", 2, 1, 0)
- Debug.Print cnt
- End Sub
- Sub dg(r&, s$, i&, j1&, t&)
- ' cnt = cnt + 1
- If z Then Exit Sub
- If i = 5 Then
- If r = 0 Then
- sr = Split(s, ",")
- t = ar(2, j1): ar(2, j1) = ar(2, sr(2)): ar(2, sr(2)) = t
- t = ar(3, j1): ar(3, j1) = ar(3, sr(3)): ar(3, sr(3)) = t
- t = ar(4, j1): ar(4, j1) = ar(4, sr(4)): ar(4, sr(4)) = t
- [a1].Resize(4, 4) = ar
- If j1 < 3 Then Call dg(h - ar(1, j1 + 1), ",", 2, j1 + 1, 0) Else z = 1: Debug.Print cnt: Exit Sub
- End If
- If s = ",,4,4,4" Then If j1 > 1 Then Call dg(h - ar(1, j1 - 1) - ar(2, j1 - 1), ",,1", 3, j1 - 1, 1) Else Stop
- Exit Sub
- Else
- For j = j1 + t To 4
- cnt = cnt + 1
- Call dg(r - ar(i, j), s & "," & j, i + 1, j1, 0)
- Next
- End If
- End Sub
复制代码 |