roczyl 发表于 2010-3-5 13:01:51

[已解决]一个排列的算法问题。

本帖最后由 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种变化。
怎么写,有点头疼,想不出来。

sanmoking 发表于 2010-3-5 13:17:43

哈哈。。。6的二次方?

roczyl 发表于 2010-3-5 13:20:27

2的6次方吧。

sanmoking 发表于 2010-3-5 14:37:16

2的6次方吧。
roczyl 发表于 2010-3-5 13:20 http://www.autoitx.com/images/common/back.gif


    恩,口误,丢脸了。。。。。。。

lanfengc 发表于 2010-3-5 21:04:54

$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仔细看代码。看不懂 回帖。 如果我没理解你的意思也可以短信我。

roczyl 发表于 2010-3-5 22:20:31

谢谢楼上的,可是这个只是输出了一种变化啊。
应该有64种。

afan 发表于 2010-3-6 02:25:44

这个看似简单,具体写起来还真有点……
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

pusofalse 发表于 2010-3-6 09:18:44

假若不用递归,这问题真不好解决。

roczyl 发表于 2010-3-6 12:03:49

这个看似简单,具体写起来还真有点……
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:17:02

本帖最后由 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)

rolaka 发表于 2010-3-6 12:28:27


;~ 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
我什么都不知道...我什么都不知道...我什么都不知道...我什么都不知道...我什么都不知道...我什么都不知道...我什么都不知道...我什么都不知道...

rolaka 发表于 2010-3-6 12:29:40

我汗...版主大人比我快一步

pusofalse 发表于 2010-3-6 12:34:57

#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兄的代码低下,用了递归的缘故。

rolaka 发表于 2010-3-6 12:45:31

:face (9):pusofalse 的代码好...= =+


我还在想是不是要...用位移...

roczyl 发表于 2010-3-6 14:29:35

多谢楼上各位。
页: [1] 2
查看完整版本: [已解决]一个排列的算法问题。