許せない心理テスト

n個の配列を全ての通り分、並び替えて表示させるアルゴリズムは作ることができるのでしょうか?
可能ならば、教えてください!!

例えば、4個の配列があるとするとその並びは24通りあるのでその24通りを表示させるといったようなものです。

A 回答 (3件)

質問に答えたことを忘れてました(笑)



こんな感じでどうですかね、今ちょろっと書いてみただけでもう少しうまい処理があるかもしれませんが…
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'組み合わせの要素が入った配列
Dim test As String() = {"1", "2", "3", "4"}

'配列をArrayListにセットする
Dim element As New ArrayList
For i As Integer = 0 To test.Length - 1
element.Add(test(i))
Next

'組み合わせ表示メソッドを呼び出す
DispCombination("", element)
End Sub

''' <summary>
''' 組み合わせ表示メソッド
''' 最終要素になるまで繰り返し呼び出される
''' </summary>
''' <param name="pattern">組み合わせのパターン</param>
''' <param name="element">要素が入ったArrayList</param>
''' <remarks></remarks>
Private Sub DispCombination(ByVal pattern As String, ByVal element As ArrayList)

'要素が最後の要素かどうかの判定フラグ
Dim isFinal As Boolean
If element.Count = 1 Then
isFinal = True
End If

'要素の数だけForで回す。
For i As Integer = 0 To element.Count - 1
'要素のArrayListのコピーを作る
Dim elementClone As ArrayList = CType(element.Clone, ArrayList)
'現在の組み合わせパターン
Dim ptn As String = pattern & element(i).ToString
'組み合わせに使った要素をArrayListから排除
elementClone.RemoveAt(i)

If isFinal Then
'最後まで組み合わせたら、出来上がったパターンをコンソールに表示
Console.WriteLine(ptn)
Else
'まだ要素が残っているなら、再帰呼び出し
DispCombination(ptn, elementClone)
End If
Next
End Sub

↓出力結果
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321
    • good
    • 0

配列から1つアイテムを選ぶ→残った配列から1つアイテムを選ぶ→以下繰り返し…


ってな感じで全網羅はできると思います。

単純に考えればForのネストで算出することになるのかなぁ。
配列とリストとかを組み合わせればうまく書けそうです。

この回答への補足

回答ありがとうございます。
しかしながら、まだまだプログラム初心者のため、うまくできませんでした。

お時間ありましたら、具体的なプログラムをいただけないでしょうか?

※現在、VB2005を扱っております。またc言語なら理解できます。

補足日時:2008/02/01 16:47
    • good
    • 0

可能です。



#Basicは書けないのですが・・「再帰呼び出し」は使えますよね?

最初にn個のうち最初の1つを確定させます。これがn通りあります(Loopで回します)。残った(n-1)について最初に選んだものを配列から削除した配列うを渡して同様にします(再帰呼び出し)。与えられる数が1になるまで繰り返せばよろしいかと思います。

この回答への補足

回答ありがとうございます。
しかしながら、早速再帰呼び出しを調べてプログラムしようとしたのですが、うまくできませんでした。

お時間ありましたら、具体的なプログラムをいただけないでしょうか?

※c言語なら理解できます。

補足日時:2008/02/01 09:57
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報