2017-06-08 2 views
1

J'ai 10 objets. Chaque objet peut être dans 3 états, 1, 2 ou 3. Prenons le résultat 1111111111. Pour ce résultat (ou un autre), j'essaie de parcourir toutes les façons dont on peut obtenir 8 sur 10 suppositions correctes pour il. Par exemple, 2111211111 serait l'un d'entre eux. J'ai réussi à faire fonctionner cela avec 9/10 avec la boucle ci-dessous, mais j'ai besoin d'aide pour que ça marche aussi avec 8/10 et 7/10.Faire une boucle sur toutes les façons possibles d'avoir x sur n suppositions correctes

Pour simplifier, supposons que la seule combinaison que nous sommes toujours vérifier est 1111111111.

Dim incorrectcombos As New Text.StringBuilder 
    For i = 2 To 3 
     For j = 0 To 9 
      Dim combo As New Text.StringBuilder 
      For k = 0 To 9 
       If k = j Then 
        combo.Append(i) 
       Else 
        combo.Append(1) 
       End If 
      Next 
      incorrectcombos.AppendLine(combo.ToString) 
     Next 
    Next 
    MessageBox.Show(incorrectcombos.ToString) 

Répondre

1

approche récursive est très simple. le code Delphi (notez que la chaîne Delphi est 1-base)

procedure GenerateCombs(s: string; MaxLen, Position, ErrCount: Integer); 
    begin 
    if Position = MaxLen + 1 then 
     Memo1.Lines.Add(s) //output string 
    else begin 
     if ErrCount <= MaxLen - Position then 
     GenerateCombs(s + '1', MaxLen, Position + 1, ErrCount); 
     if ErrCount > 0 then begin 
     GenerateCombs(s + '2', MaxLen, Position + 1, ErrCount - 1); 
     GenerateCombs(s + '3', MaxLen, Position + 1, ErrCount - 1); 
     end; 
    end; 
    end; 

begin 
    GenerateCombs('', 4, 1, 2); 

génère

1122 
1123 
1132 
1133 
1212 
1213 
1221 
1231 
1312 
1313 
1321 
1331 
2112 
2113 
2121 
2131 
2211 
2311 
3112 
3113 
3121 
3131 
3211 
3311 

C# (ideone):

using System; 

public class Test 
{ 
     static public void GenerateCombs(string s, int MaxLen, int Position, int ErrCount) 
     { 
      if (Position == MaxLen + 1) 
      { 
       Console.WriteLine(s); 
       return; 
      } 

     if (ErrCount <= MaxLen - Position) 
     { 
       GenerateCombs(s + "1", MaxLen, Position + 1, ErrCount); 
     } 

      if (ErrCount > 0) 
      { 
       GenerateCombs(s + "2", MaxLen, Position + 1, ErrCount - 1); 
       GenerateCombs(s + "3", MaxLen, Position + 1, ErrCount - 1); 
      } 
     } 

    public static void Main() 
    { 
     GenerateCombs("", 4, 1, 2); 
    } 
} 
+0

Regardez pseudocode sans commencer fin – MBo

+0

Je ne suis pas sûr comment pour implémenter ceci dans le code .net. Cela fonctionne presque si je n'inclue pas la partie saut de ligne "Begin" (sauf qu'elle ajoute 1 autre à la fin de chaque combinaison). S'il est inclus, il boucle simplement infiniment sur la première partie. Edit: Donc apparemment "Begin" fait partie de toutes les procédures Delphi. Que signifie exactement "Sinon, commencez"? – user8128940

+0

'begin .. end == {..}' – MBo