fork download
  1. Imports System.Text
  2.  
  3. Imports System.Windows.Forms
  4. Imports System.Collections.Generic
  5.  
  6. Public Class Q7112984
  7. Inherits Form
  8.  
  9. REM IDEで作るとこの辺が別ファイルになったり、開発者の意識から外されるでしょ?
  10. REM 個人的にそうやって隠すのあまり好きじゃないんだよなー
  11.  
  12. Private label1 As Label
  13. Private label2 As Label
  14. Private textbox1 As TextBox
  15. Private button1 As Button
  16.  
  17.  
  18. REM 自分で検査する必要がなくなるので個人的には単なるテキストボックスよりこっちのほうが好み。
  19. Private numberofAllItems As NumericUpDown
  20. Private numberofSelectedItems As NumericUpDown
  21.  
  22.  
  23.  
  24. Public Sub New()
  25. REM そのうちResourceManagerを用いる。
  26. REM コントロールの配置は適当に配置。
  27. Me.Text = "並び順サーチ"
  28. numberofAllItems = New NumericUpDown()
  29. numberofAllItems.AutoSize = false
  30. numberofAllItems.Value = 6
  31. numberofAllItems.Minimum = 0
  32. numberofAllItems.Increment = 1
  33.  
  34. numberofAllItems.Left = 0
  35. numberofAllItems.Width = 100
  36.  
  37. label1 = New Label()
  38. label1.AutoSize = false
  39. label1.Text = "個の中から"
  40.  
  41. label1.Left = 100
  42. label1.Width = 100
  43.  
  44.  
  45. REM わかりやすいインターフェースを提供できるなら
  46. REM AllItemsの最大値をこちらの最大値として設定すべきだが
  47. REM 下手に手を出すと分かりにくくなったり使いづらくなったりするので俺は敢えて設定しない。
  48.  
  49. numberofSelectedItems = New NumericUpDown()
  50. numberofSelectedItems.AutoSize = false
  51. numberofSelectedItems.Value = 3
  52. numberofSelectedItems.Minimum = 0
  53. numberofSelectedItems.Increment = 1
  54.  
  55. numberofSelectedItems.Left = 200
  56. numberofSelectedItems.Width = 100
  57.  
  58. label2 = New Label()
  59. label2.AutoSize = false
  60. label2.Left = 300
  61. label2.Width = 100
  62. label2.Text = "個選んで並び替える"
  63.  
  64.  
  65. button1 = New Button()
  66. button1.AutoSize = false
  67. button1.Text = "計算"
  68. button1.Top = 50
  69. button1.Left = 0
  70. button1.Width = 100
  71.  
  72. textBox1 = New TextBox()
  73. textBox1.AutoSize = false
  74. textBox1.MultiLine = true
  75.  
  76. textBox1.Left = 0
  77. textBox1.Top = 100
  78. textBox1.Width = 300
  79. textBox1.Height = 300
  80.  
  81.  
  82. AddHandler Button1.Click,AddressOf Button1_Click
  83.  
  84. Me.Controls.Add(numberofAllItems)
  85. Me.Controls.Add(label1)
  86. Me.Controls.Add(numberofSelectedItems)
  87. Me.Controls.Add(label2)
  88. Me.Controls.Add(button1)
  89. Me.Controls.Add(textbox1)
  90.  
  91.  
  92.  
  93. End Sub
  94.  
  95. Private Sub Button1_Click(sender As Object,e As System.EventArgs)
  96.  
  97. REM 何か加算演算子で改行加えるのってソースコード汚くなりやすいんだもん。
  98. REM なら、例外の方もなおせよ()>
  99. Dim sb As StringBuilder = New StringBuilder()
  100. Dim p As Permutation = New Permutation(Convert.ToInt32(numberofAllItems.Value),Convert.ToInt32(numberofSelectedItems.Value))
  101. Dim list As List(Of List(Of Integer)) = New List(Of List(Of Integer))
  102. While True
  103. Dim x As List(Of Integer) = p.GetNext()
  104. If x Is Nothing
  105. Exit While
  106. End If
  107.  
  108. list.Add(x)
  109. End While
  110.  
  111.  
  112. REM ラムダ式使っている以上気にする必要がないはずの範囲だけれど
  113. REM .NET 2.0環境で実行したときにString.Join(String separator,params Object[])
  114. REM 選択され、Listが表示された痛い経験から、配列のオーバーロードを使いたがる。
  115. For Each numbers As List(Of Integer) in list
  116. REM この辺も何とかしたい
  117. sb.AppendLine("{" + String.Join(",",numbers.ConvertAll(Function(i As Integer) i.ToString()).ToArray()) + "}")
  118. Next
  119. textbox1.Text = sb.ToString()
  120.  
  121. MessageBox.Show(list.Count.ToString())
  122.  
  123.  
  124. End Sub
  125.  
  126. Public Shared Sub Main()
  127. Dim form1 As Q7112984 = New Q7112984()
  128. form1.ShowDialog()
  129. End Sub
  130.  
  131. End Class
  132.  
  133. Class Permutation
  134.  
  135. Private x As List(Of Integer)
  136. Private n As Integer
  137. Private m As Integer
  138. Public Sub New(n1 As Integer,m1 As Integer)
  139. REM そのうち文字列操作を考えなくていい形にしたい。
  140.  
  141. If n1 < 1 Then
  142. Throw New ArgumentException("nは1より大きくなれければなりません。" + "(n) = " + n.ToString())
  143. End If
  144. If m1 < 1 Then
  145. Throw New ArgumentException("mは1より大きくなれければなりません。" + "(m) = " + m.ToString())
  146. End If
  147. If m1 > n1 Then
  148. Throw New ArgumentException("mがnより大きいです。" + "(m,n) = (" + m.ToString() + "," + n.ToString() + ")")
  149. End If
  150.  
  151. n = n1
  152. m = m1
  153.  
  154. x = New List(Of Integer)
  155. For i As Integer = 0 to m-1
  156. x.Add(0)
  157. Next i
  158. End Sub
  159.  
  160.  
  161. Public Function GetNext() As List(Of Integer)
  162. Dim retval As List(Of Integer) = New List(Of Integer)(x)
  163. While True
  164. retval(retval.Count-1) = retval(retval.Count-1) + 1
  165. For i As Integer = retval.Count - 1 to 1 Step -1
  166.  
  167. If retval(i) >= n Then
  168. retval(i) = 0
  169. retval(i - 1) = retval(i - 1) + 1
  170. Else
  171. Exit For
  172. End If
  173. Next
  174.  
  175. If retval(0) = n Then
  176. Return Nothing
  177. End If
  178.  
  179. REM VB.NETの製品バージョンに依存するかも。
  180. REM 拡張メソッドIEnumerable<TSource> Enumerable.Distinct(this IEnumerable<TSource> source)
  181. REM なんかMonoDevelop + vbncでプロジェクト作ると、プラットフォーム「.NET 4.0」が選択できない
  182. If retval.Distinct().Count = retval.Count Then
  183. Exit While
  184. End If
  185. End While
  186. x = retval
  187. Return retval
  188. End Function
  189.  
  190.  
  191.  
  192. End Class
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty