• 締切済み

組み合わせについての質問です。このアルゴリズムは作ることは可能ですか?

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

みんなの回答

  • NYOI
  • ベストアンサー率58% (56/96)
回答No.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

すると、全ての回答が全文表示されます。
  • NYOI
  • ベストアンサー率58% (56/96)
回答No.2

配列から1つアイテムを選ぶ→残った配列から1つアイテムを選ぶ→以下繰り返し… ってな感じで全網羅はできると思います。 単純に考えればForのネストで算出することになるのかなぁ。 配列とリストとかを組み合わせればうまく書けそうです。

shishsi
質問者

補足

回答ありがとうございます。 しかしながら、まだまだプログラム初心者のため、うまくできませんでした。 お時間ありましたら、具体的なプログラムをいただけないでしょうか? ※現在、VB2005を扱っております。またc言語なら理解できます。

すると、全ての回答が全文表示されます。
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

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

shishsi
質問者

補足

回答ありがとうございます。 しかしながら、早速再帰呼び出しを調べてプログラムしようとしたのですが、うまくできませんでした。 お時間ありましたら、具体的なプログラムをいただけないでしょうか? ※c言語なら理解できます。

すると、全ての回答が全文表示されます。

関連するQ&A