Поскольку каждый член является ди git, и вы будете выводить string
, достаточно просто сохранить символы для каждого ди git.
var pinCode = new char[4];
Вам нужно 4 цифры, так что читайте в 4 строки и проверяйте каждый вход, чтобы убедиться, что это просто ди git. Сохраняйте каждый ди git в массиве pinCode
.
for (int i = 0; i < 4; i++) {
Console.Write("Numerical Digit {0}: ", i);
string inLine;
do {
inLine = Console.ReadLine();
} while (inLine.Length != 1 && !Char.IsDigit(inLine[0]));
pinCode[i] = inLine[0];
Console.WriteLine(inLine);
}
Поскольку вы будете наращивать (и разрушать) string
символ за символом, использование StringBuilder
гораздо эффективнее чем генерация string
s, которые будут выброшены G C позже.
var onePermutation = new StringBuilder(4);
Нам нужна вложенная l oop для каждой выходной позиции, которая проходит через все возможные символы в каждом должность. В каждом вложенном l oop пропустите любые символы, уже использованные внешним l oop для более ранней позиции.
for (int a = 0; a < 4; a++) {
onePermutation.Append(pinCode[a]);
for (int b = 0; b < 4; b++) {
if (a == b) // don't reuse a digit
continue;
onePermutation.Append(pinCode[b]);
for (int c = 0; c < 4; c++) {
if (c == a || c == b) // don't reuse a digit
continue;
onePermutation.Append(pinCode[c]);
for (int d = 0; d < 4; d++) {
if (d == c || d == b || d == a) // don't reuse a digit
continue;
onePermutation.Append(pinCode[d]);
Console.WriteLine(onePermutation.ToString());
// after each character is used (output) remove it
--onePermutation.Length;
}
--onePermutation.Length;
}
--onePermutation.Length;
}
--onePermutation.Length;
}
Если допустимо, чтобы pinCode
s были одинаковыми, но все равно не требует дублирования вывода, вам придется кэшировать вывод и либо использовать Distinct
в конце, либо проверять перед каждым выводом, что он ранее не выводился. (Спасибо @schwechel.)