[已解决]一个排列的算法问题。
本帖最后由 roczyl 于 2010-3-6 14:29 编辑AB-CD-EF-GH-IJ-KL
现在需要各种排列组合。
如:AB 变成BA。
AB-CD-EF-GH-IJ-KL
AB-DC-EF-GH-IJ-KL
……
就是各个里面自己对调。
一共6部分,每部分有2种变化,应该是64种变化。
我要循环输出这64种变化。
怎么写,有点头疼,想不出来。 哈哈。。。6的二次方? 2的6次方吧。 2的6次方吧。
roczyl 发表于 2010-3-5 13:20 http://www.autoitx.com/images/common/back.gif
恩,口误,丢脸了。。。。。。。 $1=main("AB-CD-EF-GH-IJ-KL")
MsgBox(0,"",$1)
Func main($String="AB-CD-EF-GH-IJ-KL")
Local $Arr,$Temp,$ResultString
$Arr=StringSplit($String,"-")
For $I=1 To 6 Step 1
$Temp=ChangeChar($Arr[$I])&"-"
$ResultString=$ResultString&$Temp
Next
$ResultString=StringTrimRight($ResultString,1)
Return $ResultString
EndFunc
Func ChangeChar($Chars="12")
Local $FirstChar,$SecondChar,$ResultChar
$FirstChar=StringLeft($Chars,1)
$SecondChar=StringRight($Chars,1)
$ResultChar=$SecondChar&$FirstChar
Return $ResultChar
EndFunc仔细看代码。看不懂 回帖。 如果我没理解你的意思也可以短信我。 谢谢楼上的,可是这个只是输出了一种变化啊。
应该有64种。 这个看似简单,具体写起来还真有点……
AB-CD-EF-GH-IJ-KL
AB-CD-EF-GH-IJ-LK
AB-CD-EF-GH-JI-KL
AB-CD-EF-GH-JI-LK
AB-CD-EF-HG-IJ-KL
AB-CD-EF-HG-IJ-LK
AB-CD-EF-HG-JI-KL
AB-CD-EF-HG-JI-LK
AB-CD-FE-GH-IJ-KL
AB-CD-FE-GH-IJ-LK
AB-CD-FE-GH-JI-KL
AB-CD-FE-GH-JI-LK
AB-CD-FE-HG-IJ-KL
AB-CD-FE-HG-IJ-LK
AB-CD-FE-HG-JI-KL
AB-CD-FE-HG-JI-LK
AB-DC-EF-GH-IJ-KL
AB-DC-EF-GH-IJ-LK
AB-DC-EF-GH-JI-KL
AB-DC-EF-GH-JI-LK
AB-DC-EF-HG-IJ-KL
AB-DC-EF-HG-IJ-LK
AB-DC-EF-HG-JI-KL
AB-DC-EF-HG-JI-LK
AB-DC-FE-GH-IJ-KL
AB-DC-FE-GH-IJ-LK
AB-DC-FE-GH-JI-KL
AB-DC-FE-GH-JI-LK
AB-DC-FE-HG-IJ-KL
AB-DC-FE-HG-IJ-LK
AB-DC-FE-HG-JI-KL
AB-DC-FE-HG-JI-LK
BA-CD-EF-GH-IJ-KL
BA-CD-EF-GH-IJ-LK
BA-CD-EF-GH-JI-KL
BA-CD-EF-GH-JI-LK
BA-CD-EF-HG-IJ-KL
BA-CD-EF-HG-IJ-LK
BA-CD-EF-HG-JI-KL
BA-CD-EF-HG-JI-LK
BA-CD-FE-GH-IJ-KL
BA-CD-FE-GH-IJ-LK
BA-CD-FE-GH-JI-KL
BA-CD-FE-GH-JI-LK
BA-CD-FE-HG-IJ-KL
BA-CD-FE-HG-IJ-LK
BA-CD-FE-HG-JI-KL
BA-CD-FE-HG-JI-LK
BA-DC-EF-GH-IJ-KL
BA-DC-EF-GH-IJ-LK
BA-DC-EF-GH-JI-KL
BA-DC-EF-GH-JI-LK
BA-DC-EF-HG-IJ-KL
BA-DC-EF-HG-IJ-LK
BA-DC-EF-HG-JI-KL
BA-DC-EF-HG-JI-LK
BA-DC-FE-GH-IJ-KL
BA-DC-FE-GH-IJ-LK
BA-DC-FE-GH-JI-KL
BA-DC-FE-GH-JI-LK
BA-DC-FE-HG-IJ-KL
BA-DC-FE-HG-IJ-LK
BA-DC-FE-HG-JI-KL
BA-DC-FE-HG-JI-LK 假若不用递归,这问题真不好解决。 这个看似简单,具体写起来还真有点……
AB-CD-EF-GH-IJ-KL
AB-CD-EF-GH-IJ-LK
AB-CD-EF-GH-JI-KL
AB-CD ...
afan 发表于 2010-3-6 02:25 http://www.autoitx.com/images/common/back.gif
谢谢,是64个,不知道是代码搞出来的吗? 本帖最后由 afan 于 2010-3-6 12:20 编辑
回复 9# roczyl
当然不是手写的,手写更费脑子…… 以下代码未经优化Dim $str = 'AB-CD-EF-GH-IJ-KL'
Dim $begin = TimerInit(), $OUT = ''
Dim $sS = StringSplit($str, '-')
Dim $d2 = []
For $i = 1 To UBound($sS) - 1
$d2[$i] = $sS[$i]
$aa = StringSplit($sS[$i], '')
$d2[$i] = $aa & $aa
Next
For $i1 = 0 To 1
$OUT1 = $d2[$i1]
For $i2 = 0 To 1
$OUT2 = $d2[$i2]
For $i3 = 0 To 1
$OUT3 = $d2[$i3]
For $i4 = 0 To 1
$OUT4 = $d2[$i4]
For $i5 = 0 To 1
$OUT5 = $d2[$i5]
For $i6 = 0 To 1
$OUT6 = $d2[$i6]
$OUT &= $OUT1 & '-' & $OUT2 & '-' & $OUT3 & '-' & $OUT4 & '-' & $OUT5 & '-' & $OUT6 & @CRLF
Next
Next
Next
Next
Next
Next
MsgBox(0, TimerDiff($begin), $OUT)
;FileWrite('输出.txt', $OUT)
;~ AB-CD-EF-GH-IJ-KL
$str = "AB-CD-EF-GH-IJ-KL"
;分割
$element = StringSplit($str, "-", 2)
;反转
Local $re_element
For $i = 0 To UBound($element)-1
$re_element[$i] = StringRight($element[$i], 1) & StringLeft($element[$i], 1)
Next
;第一层
For $i1 = 0 To 1
;第二层
For $i2 = 0 To 1
;第二层
For $i3 = 0 To 1
;第四层
For $i4 = 0 To 1
;第五层
For $i5 = 0 To 1
;第六层
For $i6 = 0 To 1
ConsoleWrite(_retuen(1, $i1)&"-"&_retuen(2, $i2)&"-"&_retuen(3, $i3)&"-"&_retuen(4, $i4)&"-"&_retuen(5, $i5)&"-"&_retuen(6, $i6)&@CRLF)
Next
Next
Next
Next
Next
Next
Func _retuen($i, $v)
If $v == 0 Then
;~ MsgBox(0, $i, $v)
Return $element[$i-1]
Else
Return $re_element[$i-1]
EndIf
EndFunc
我什么都不知道...我什么都不知道...我什么都不知道...我什么都不知道...我什么都不知道...我什么都不知道...我什么都不知道...我什么都不知道... 我汗...版主大人比我快一步 #include <Array.au3>
Local $sVar = "AB-CD-EF-GH-IJ-KL"
Local $sResult = $sVar & @CR
Local $aVar = StringSplit($sVar, "-")
For $i = 1 to $aVar
_StringRepermutation($sVar, $sResult, $i)
Next
$aVar = StringSplit(StringTrimRight($sResult, 1), @CR, 1)
_Arraydisplay($aVar)
Func _StringRepermutation($sString, ByRef $sResult, $iComponents)
Local $sVar, $aVar
$aVar = StringSplit($sString, "-")
For $i = 1 To $iComponents
$sVar &= StringRight($aVar[$i], 1) & StringLeft($aVar[$i], 1) & "-"
Next
If ($iComponents < $aVar) Then
$sVar &= StringRight($sString, ($aVar * 3 - 1) - $iComponents * 3) & "-"
EndIf
$sVar = StringTrimRight($sVar, 1)
For $i = $iComponents + 1 To $aVar
_StringRepermutation($sVar, $sResult, $i)
Next
$sResult &= $sVar & @CR
EndFunc ;==>_StringRepermutation练练手,效率比afan兄的代码低下,用了递归的缘故。 :face (9):pusofalse 的代码好...= =+
我还在想是不是要...用位移... 多谢楼上各位。
页:
[1]
2