- ベストアンサー
順列を列挙するプログラムの変更点は?
- 組み合わせを求めるプログラムを順列を列挙するプログラムに変更する方法を教えてください。
- VBのプログラムで、組み合わせを求めるアルゴリズムを順列を列挙するアルゴリズムに変更する方法を教えてください。
- 順列を列挙するプログラムで、どの部分を変更すると組み合わせから順列を求めることができるのか教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
ANo2~5です。 すいませんが、これまでのは、廃棄願います。 Public Class Form1 Dim w0, w1, count As String dim w2 As String '★追加 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Text = "コンビネーションサーチ" Label1.Text = "個の中から" Label2.Text = "個とる組リスト" Button1.Text = "計算" TextBox1.Text = "6" TextBox2.Text = "3" TextBox3.Text = "" TextBox3.ScrollBars = ScrollBars.Vertical count = 0 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim n, m As Integer n = TextBox1.Text m = TextBox2.Text w1 = " }" w0 = "{ " TextBox3.Text = "" count = 0 combisearch(1, n, m) MsgBox("組み合わせ個数は、" & count & "個です。") End Sub Sub combisearch(ByVal st, ByVal ed, ByVal depth) Dim i, temp If depth - 1 < 1 Then For i = 1 To ed '★置き換え 'For i = st To ed If InStr(w2, CStr(i) & " ") = 0 Then '★追加:重複の除外 TextBox3.Text &= w0 & i & w1 & vbCrLf count += 1 End If '★追加 Next w2 = "" '★追加 Else For i = 1 To ed '★置き換え 'For i = st To ed If InStr(w2, CStr(i) & " ") = 0 Then '★追加:重複の除外 temp = w0 w0 &= i & " " w2 = w2 & i & " " '★追加 combisearch(i + 1, ed, depth - 1) w0 = temp w2 = temp '★追加 End If '★追加 Next End If End Sub End Class ## EXCEL VBAで試しているので ## 書き換えでミスばっかりしてすいません。 5P4=120 と 5P2=20 がうまくいっていたのでたぶん大丈夫かと。
その他の回答 (4)
- Siegrune
- ベストアンサー率35% (316/895)
あっ、すいません。 combisearch(1, ed, depth - 1 , i) です。 でも、depth = 2 のときうまくいくはずですが、 depth >2 のときに問題があることに気づいたのでちょっと考え直して改めて回答いれます。
- Siegrune
- ベストアンサー率35% (316/895)
ANo.2です。 >補足 >この方法では、重複順列を許しております。 大変失礼しました。 うっかりミスしていました。 以下の例のようにサブルーチンに除外する数字を渡すことで対応できると思います。 注:-999999999は除外する数字はないという意味。 ・・・ combisearch(1, n, m,-999999999) 'combisearch(1, n, m) MsgBox("組み合わせ個数は、" & count & "個です。") End Sub Sub combisearch(ByVal st, ByVal ed, ByVal depth,ByVal myVal) 'Sub combisearch(ByVal st, ByVal ed, ByVal depth) Dim i, temp If depth - 1 < 1 Then For i = st To ed if i <> myVal then '追加:重複の除外 TextBox3.Text &= w0 & i & w1 & vbCrLf count += 1 end if '追加 Next Else For i = st To ed if i <> myVal then '追加:重複の除外 temp = w0 w0 &= i & " " 'ここだけ。 combisearch(1, ed, depth - 1) 'combisearch(i + 1, ed, depth - 1) w0 = temp end if '追加 Next End If End Sub
補足
2回目のご回答ありがとうございます。 しかし、 permsearch(1, ea, deptha - 1) の部分で、下記のエラーが出ます。 誠に申し訳ありませんが、どう対処すればよいでしょうか。 教えていただけませんでしょうか。 エラーメッセージ内容 ここから エラー 1 説明:'Public Sub permsearch(sa As Object, ea As Object, deptha As Object, myVal As Object)' のパラメーター 'myVal' に対して引数が指定されていません。 ファイル:G:\順列 & 組み合わせ探索\順列 組み合わせ探索\順列 組み合わせ探 索\Form1.vb 行:150 列:21 プロジェクト:順列 組み合わせ探索 ここまで なお、stは、saに、edは、eaに、depthは、depthaに変えております。
- Siegrune
- ベストアンサー率35% (316/895)
Sub combisearch(ByVal st, ByVal ed, ByVal depth) Dim i, temp If depth - 1 < 1 Then For i = st To ed TextBox3.Text &= w0 & i & w1 & vbCrLf count += 1 Next Else For i = st To ed temp = w0 w0 &= i & " " 'ここだけ。 combisearch(1, ed, depth - 1) 'combisearch(i + 1, ed, depth - 1) w0 = temp Next End If End Sub End Class
補足
ご回答ありがとうございました。 しかし、この方法では、重複順列を許しております。 たとえば、5,2と入力すれば、5*4=20通りとなるのですが、ここでは、25となります。 つまり、(1,1).(2,2).(3,3).(4,4).(5,5)が余計です。 これを省く方法をできれば教えていただけませんでしょうか。 お願いいたします。
- himajin100000
- ベストアンサー率54% (1660/3060)
無理に拡張しようとせず、設計しなおした。 https://ideone.com/52cT1
お礼
今まで、ご回答ありがとうございました。 おかげさまで、見事順列列挙プログラムが完成しました。 また、プログラムのことで何か困ったことがあれば、ご回答お願いいたします。