写个递归的上来: Public arr1(), arr2(1 To 1048575, 1 To 1) Public dic As New Dictionary Public l As Long Sub test() t = Timer l = 1 Dim num1 As Integer, num2 As Integer w = 10 b = 10 'dic.RemoveAll Range("a1:a1048576").Clear Range("a1") = w & "*" & b ReDim arr1(1 To w + b) For k = 1 To w + b arr1(k) = "w" Next k num1 = IIf(w > b, w, b) + 1 num2 = w + b Call ps(1, num1, num2) MsgBox Timer - t MsgBox dic.Count 'Range("a2").Resize(dic.Count, 1) = Application.Transpose(dic.Keys) '为10*10时此句出错,dic.count为184756,11*11时为745032,故改为数组 Range("a2").Resize(1048575, 1) = arr2 End Sub Sub ps(i As Integer, num1 As Integer, num2 As Integer) If num2 > num1 Then For k = i To num1 arr1(k) = "b" j1 = k + 1 j2 = num1 + 1 Call ps(k + 1, num1 + 1, num2) arr1(k) = "w" Next k Else For k = i To num1 arr1(k) = "b" s = Replace(Join(arr1), " ", "") arr2(l, 1) = s l = l + 1 ' s = dic(s) arr1(k) = "w" Next k End If End Sub |