• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:順列のプログラムについて(VB))

順列を列挙するプログラムの変更点は?

このQ&Aのポイント
  • 組み合わせを求めるプログラムを順列を列挙するプログラムに変更する方法を教えてください。
  • VBのプログラムで、組み合わせを求めるアルゴリズムを順列を列挙するアルゴリズムに変更する方法を教えてください。
  • 順列を列挙するプログラムで、どの部分を変更すると組み合わせから順列を求めることができるのか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.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 がうまくいっていたのでたぶん大丈夫かと。

toshisanpc
質問者

お礼

今まで、ご回答ありがとうございました。 おかげさまで、見事順列列挙プログラムが完成しました。 また、プログラムのことで何か困ったことがあれば、ご回答お願いいたします。

その他の回答 (4)

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.4

あっ、すいません。 combisearch(1, ed, depth - 1 , i) です。 でも、depth = 2 のときうまくいくはずですが、 depth >2 のときに問題があることに気づいたのでちょっと考え直して改めて回答いれます。

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.3

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

toshisanpc
質問者

補足

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)
回答No.2

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

toshisanpc
質問者

補足

ご回答ありがとうございました。 しかし、この方法では、重複順列を許しております。 たとえば、5,2と入力すれば、5*4=20通りとなるのですが、ここでは、25となります。 つまり、(1,1).(2,2).(3,3).(4,4).(5,5)が余計です。 これを省く方法をできれば教えていただけませんでしょうか。 お願いいたします。

回答No.1

無理に拡張しようとせず、設計しなおした。 https://ideone.com/52cT1

関連するQ&A