2014-01-13 5 views
2

У меня есть такая строка, как это C - F - A - M. я хочу, чтобы создать комбинацию из условия, что при:vb .net перестановка строки. перестановка или комбинация?

  1. друг друга элемент у последнего символа должен быть объединен с последним символом
  2. там не позволил ту же самую комбинацию, даже порядок отличается. например

    FC - М

    CF - М

  3. если массив строка содержит> = 3 элемента он будет генерировать 2 & 3 НИКАКИХ гарантий, если два элемента, то он будет генерировать только 2 НИКАКИХ гарантий

ниже мой код. мой код сгенерирует результат как правую часть изображения

мой вопрос - какой метод я должен использовать? это перестановка, комбинация или другие вещи? , а в псевдокоде, что будет с моим делом?

вот моего код

Public Class permute 
Dim ItemUsed() As Boolean 
Dim pno As Long, pString As String 
Dim inChars() As Char = {"c", "f", "a", "m"} 

Private Sub permute_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
End Sub 

Sub Permute(ByVal K As Long) 
    ReDim ItemUsed(K) 
    pno = 0 

    Dim i As Integer 
    For i = 2 To K 
     Permutate(i, 1) 
     tb.Text = K 
    Next 
End Sub 

Private Sub Permutate(ByVal K As Long, ByVal pLevel As Long) 
    Dim i As Long, Perm As String 
    Perm = pString 

    For i = 0 To K - 1 
     If Not ItemUsed(i) Then 
      If pLevel = 1 Then 
       pString = inChars(i) 
      Else 
       pString += inChars(i) 
      End If 
      If pLevel = K Then 
       pno = pno + 1 
       Results.Text += _ 
       pno & " " & " = " & " " & pString & vbCrLf 
       Exit Sub 
      End If 

      ItemUsed(i) = True 
      Permutate(K, pLevel + 1) 
      ItemUsed(i) = False 
      pString = Perm 
     End If 
    Next 
End Sub 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Permute(tb.Text) 
End Sub 

Private Sub tb_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tb.TextChanged 
    If tb.Text = "" Then 
     Results.Text = "" 
    Else 
     Permute(tb.Text) 
    End If 
End Sub 
End Class 

вот скриншот требования

enter image description here

и вот скриншот программы

enter image description here

+0

это ваша домашняя работа? –

+0

мой тезис точно, и я просто прошу псевдокод, потому что я до сих пор не понимаю, как кодировать, не понимая, как это работает сначала в алгоритме –

ответ

1

Это, кажется, Сочетание проблемы, а не Перестановка:

«В математике, комбинация представляет собой способ выбора нескольких вещей из более крупной группы, где (в отличие от перестановок) порядок не имеет значения». [Wikipedia]

Попытка решить эту проблему, делая Combination всем элементу массива, за исключением последнего пункта. Или, другими словами, сделать Комбинация операций NCK для всех к с

  • п = размер входного массива минус последнего элемента
  • к = размер выходного НИКАКИХ гарантий , минимальная к равно 1 и максимум п

Затем добавьте каждый Комбинация результат с последним товаром.Ниже приведен код псевдокод, используя C# синтаксис: р

var input = new char[] {'C', 'F', 'A', 'M'}; 

//save last char 
var lastChar = input[input.Length - 1]; 
//combinationInput is input member without the last character 
var combinationInput = new char[input.Length - 1]; 
Array.Copy(input, 0, combinationInput, 0, combinationInput.Length); 

//generate output with itemset size 1 to combinationInput.Length 
for (int i = 1; i <= combinationInput.Length; i++) 
{ 
    //generate combination with size i 
    var combinationOutput = combinationInput.Combinations(i); 
    foreach (var combinedChar in combinationOutput) 
    { 
     //print output as: combinationOutput item + lastChar 
     Console.WriteLine(string.Join(", ", combinedChar) + ", " + lastChar); 
    } 
} 

Ссылки:

  1. Array.Copy(...). [How to copy part of an array to another array]
  2. .Combinations(int outputSize) способ расширения. [How to Generate Combinations of Elements of a List in .NET 4.0]
2

Добавить этот класс в проект:

Public NotInheritable Class Permutation 

    Public Shared Function Create(array As Char()) As List(Of String) 
     Return Permutation.Create(array, False) 
    End Function 

    Public Shared Function Create(array As Char(), sort As Boolean) As List(Of String) 
     If (array Is Nothing) Then 
      Throw New ArgumentNullException("array") 
     ElseIf ((array.Length < 0) OrElse (array.Length > 13)) Then 
      Throw New ArgumentOutOfRangeException("array") 
     End If 
     Dim list As New List(Of String) 
     Dim n As Integer = array.Length 
     Permutation.Permute(list, array, 0, array.Length) 
     If (sort) Then 
      list.Sort() 
     End If 
     Return list 
    End Function 

    Private Shared Sub Permute(list As List(Of String), array As Char(), start As Integer, n As Integer) 
     Permutation.Print(list, array, n) 
     If (start < n) Then 
      Dim i, j As Integer 
      For i = (n - 2) To start Step -1 
       For j = (i + 1) To (n - 1) 
        Permutation.Swap(array, i, j) 
        Permutation.Permute(list, array, (i + 1), n) 
       Next 
       Permutation.RotateLeft(array, i, n) 
      Next 
     End If 
    End Sub 

    Private Shared Sub Print(list As List(Of String), array As Char(), size As Integer) 
     If (array.Length <> 0) Then 
      Dim s As Char() = New Char(size - 1) {} 
      For i As Integer = 0 To (size - 1) 
       s(i) = array(i) 
      Next 
      list.Add(s) 
     End If 
    End Sub 

    Private Shared Sub RotateLeft(array As Char(), start As Integer, n As Integer) 
     Dim tmp As Char = array(start) 
     For i As Integer = start To (n - 2) 
      array(i) = array(i + 1) 
     Next 
     array(n - 1) = tmp 
    End Sub 

    Private Shared Sub Swap(array As Char(), i As Integer, j As Integer) 
     Dim tmp As Char 
     tmp = array(i) 
     array(i) = array(j) 
     array(j) = tmp 
    End Sub 

End Class 

Из-за Int32.MaxValue предела этот класс будет поддерживать уровни от 1 до 13.

s=1, n=1 
s=2, n=2 
s=3, n=6 
s=4, n=24 
s=5, n=120 
s=6, n=720 
s=7, n=5040 
s=8, n=40320 
s=9, n=362880 
s=10, n=3628800 
s=11, n=39916800 
s=12, n=479001600 
s=13, n=6227020800 

Использование:

Me.TextBox1.Text = String.Join(Environment.NewLine, Permutation.Create({"c"c, "f"c, "a"c, "m"c}, sort:=False)) 

Выход:

cfam 
cfma 
cafm 
camf 
cmfa 
cmaf 
fcam 
fcma 
facm 
famc 
fmca 
fmac 
acfm 
acmf 
afcm 
afmc 
amcf 
amfc 
mcfa 
mcaf 
mfca 
mfac 
macf 
mafc 

Класс основан на C++ код по следующей ссылке:

Calculating Permutations and Job Interview Questions

+0

Traceback;) http://stackoverflow.com/questions/25389240/generating -все-возможных-перестановкам-для-а-данные по длине и-множество-символов/25389806 # 25389806 –

Смежные вопросы