找回密码
 加入
搜索
查看: 8683|回复: 16

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

 火.. [复制链接]
发表于 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种变化。
怎么写,有点头疼,想不出来。

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2010-3-5 13:17:43 | 显示全部楼层
哈哈。。。6的二次方?
 楼主| 发表于 2010-3-5 13:20:27 | 显示全部楼层
2的6次方吧。
发表于 2010-3-5 14:37:16 | 显示全部楼层
2的6次方吧。
roczyl 发表于 2010-3-5 13:20



    恩,口误,丢脸了。。。。。。。
发表于 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
仔细看代码。  看不懂 回帖。 如果我没理解你的意思也可以短信我。
 楼主| 发表于 2010-3-5 22:20:31 | 显示全部楼层
谢谢楼上的,可是这个只是输出了一种变化啊。
应该有64种。
发表于 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
发表于 2010-3-6 09:18:44 | 显示全部楼层
假若不用递归,这问题真不好解决。
 楼主| 发表于 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


  谢谢,是64个,不知道是代码搞出来的吗?
发表于 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[UBound($sS)][2] = [[UBound($sS) - 1]]
For $i = 1 To UBound($sS) - 1
        $d2[$i][0] = $sS[$i]
        $aa = StringSplit($sS[$i], '')
        $d2[$i][1] = $aa[2] & $aa[1]
Next
For $i1 = 0 To 1
        $OUT1 = $d2[1][$i1]
        For $i2 = 0 To 1
                $OUT2 = $d2[2][$i2]
                For $i3 = 0 To 1
                        $OUT3 = $d2[3][$i3]
                        For $i4 = 0 To 1
                                $OUT4 = $d2[4][$i4]
                                For $i5 = 0 To 1
                                        $OUT5 = $d2[5][$i5]
                                        For $i6 = 0 To 1
                                                $OUT6 = $d2[6][$i6]
                                                $OUT &= $OUT1 & '-' & $OUT2 & '-' & $OUT3 & '-' & $OUT4 & '-' & $OUT5 & '-' & $OUT6 & @CRLF
                                        Next
                                Next
                        Next
                Next
        Next
Next

MsgBox(0, TimerDiff($begin), $OUT)
;FileWrite('输出.txt', $OUT)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 2金钱 +30 贡献 +1 收起 理由
nmgwddj + 10 + 1
pusofalse + 20

查看全部评分

发表于 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[UBound($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
我什么都不知道...我什么都不知道...我什么都不知道...我什么都不知道...我什么都不知道...我什么都不知道...我什么都不知道...我什么都不知道...

评分

参与人数 2威望 +1 金钱 +40 收起 理由
nmgwddj + 20 帅!!
afan + 1 + 20 学习了~

查看全部评分

发表于 2010-3-6 12:29:40 | 显示全部楼层
我汗...版主大人比我快一步
发表于 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[0]
        _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[0]) Then
                $sVar &= StringRight($sString, ($aVar[0] * 3 - 1) - $iComponents * 3) & "-"
        EndIf
        $sVar = StringTrimRight($sVar, 1)
        For $i = $iComponents + 1 To $aVar[0]
                _StringRepermutation($sVar, $sResult, $i)
        Next
        $sResult &= $sVar & @CR
EndFunc        ;==>_StringRepermutation
练练手,效率比afan兄的代码低下,用了递归的缘故。

评分

参与人数 3金钱 +50 收起 理由
nmgwddj + 20 帅 可以做每周任务了。每周任务我就一个都没 ...
roczyl + 10
afan + 20 学习了~

查看全部评分

发表于 2010-3-6 12:45:31 | 显示全部楼层
pusofalse 的代码好...= =+


我还在想是不是要...用位移...
 楼主| 发表于 2010-3-6 14:29:35 | 显示全部楼层
多谢楼上各位。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-10 10:56 , Processed in 0.111708 second(s), 31 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表