|
发表于 2013-7-30 16:03
|
显示全部楼层
本楼为最佳答案
本帖最后由 wcymiss 于 2013-7-30 16:09 编辑
- Private arrResult(1 To 30) As String
- Private arrDicKeys()
- Private Success As Boolean
- Sub Main1() '回溯
- Const strData As String = "AAAAAABBBBBCCCCCCDDDEEEFGGGHHH"
- Dim objDic As Object
- Dim i As Integer
- Dim arrDicItems()
-
- Set objDic = CreateObject("scripting.dictionary")
- For i = 1 To Len(strData)
- objDic(Mid(strData, i, 1)) = objDic(Mid(strData, i, 1)) + 1
- Next
- arrDicKeys = objDic.keys '不重复字符列表
- arrDicItems = objDic.items '每个字符个数
- Set objDic = Nothing
-
- Call subProgram(1, arrDicItems)
- If Success Then
- MsgBox Join(arrResult, "")
- Else
- MsgBox "无法找到符合条件的字符串!"
- End If
- End Sub
- Private Sub subProgram(ByVal intPos As Integer, ByVal arrLimit)
- 'intPos:字符位置
- 'arrLimit:每个字符的个数限制
- Dim intKeyPos As Integer 'dickey的位置
- Dim arrLimitTemp
-
- intKeyPos = -1
-
- Do
- intKeyPos = intKeyPos + 1
- If arrLimit(intKeyPos) = 0 Then
- GoTo NEXTDO '已用光本字符,退出
- End If
-
- arrResult(intPos) = arrDicKeys(intKeyPos) '选值
-
- If intPos <> 1 Then
- If arrResult(intPos) = arrResult(intPos - 1) Then
- If intPos <> 9 And intPos <> 16 And intPos <> 23 Then '如果位置非9、16、23
- GoTo NEXTDO '相邻的字符一样,不符合,退出
- End If
- End If
- End If
-
- If intPos > 8 Then
- If arrResult(intPos) = arrResult(intPos - 8) Then GoTo NEXTDO '不符合,退出
- If arrResult(intPos) = arrResult(intPos - 7) Then GoTo NEXTDO '不符合,退出
- If arrResult(intPos) = arrResult(intPos - 6) Then GoTo NEXTDO '不符合,退出
- End If
-
- If intPos < 30 Then '未找满30个字符串则继续
- arrLimitTemp = arrLimit
- arrLimitTemp(intKeyPos) = arrLimit(intKeyPos) - 1
- Call subProgram(intPos + 1, arrLimitTemp)
- Else
- Success = True
- End If
- NEXTDO:
- Loop Until Success Or intKeyPos = UBound(arrDicKeys)
- End Sub
复制代码 |
评分
-
查看全部评分
|