我有10个物体。每个对象可以处于3个状态,1,2或3.让我们取结果1111111111.对于那个结果(或任何其他),我试图循环通过所有方式可以获得8个结果10个猜测是正确的。例如,2111211111将是其中之一。我已经设法通过下面的循环将其与9/10一起使用,但我需要帮助才能让它与8/10和7/10一起工作。
为简单起见,我们假设我们检查的唯一组合是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)
答案 0 :(得分:1)
递归方法非常简单。 Delphi代码(注意Delphi字符串是基于1的)
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);
产生
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);
}
}