Необходимо найти и вывести на экран все последовательности длины N из чисел 1,2,...,M. Это одна из типовых задач программирования, с которой, думаю, каждый хотя бы раз в том или ином виде сталкивался или столкнется при работе над каким-либо проектом. И в этой статье, посвященной различным алгоритмам, реализованным на языке C# мы и решим эту саму задачу о поиске всех возможных последовательностей.
Задача
Пользователь вводит с клавиатуры два числа: N — длину каждой последовательности, M — последнее число из ряда 1...M. Программа должна составить N последовательностей длиной N из ряда чисел 1..M.
Суть решения задачи
Чтобы понять, как должен выглядеть результат, представим задачу с конкретными значениями, например, N = 4, M = 3. Тогда наша программа должна составить и вывести следующие последовательности:
(1,1,1,1) (1,1,1,2) (1,1,1,3) (1,1,2,1) (3,1,3,3) (3,2,1,1)....(3,3,3,3)
Количество таких последовательностей всегда будет равно M^N.
Для решения задачи нам понадобятся следующие знания: что такое массив и работа с циклами.
Реализация алгоритма поиска последовательностей на C#
Ниже представлен код программы на C#, реализующий поиск и вывод всех последовательностей длиной N из ряда чисел 1..M
class Program
{
static void Main(string[] args)
{
byte m;
byte n;
byte[] Sequence;
int counter = 1;
Console.WriteLine("Введите количество элементов последовательности (N) и нажмите Enter");
n = byte.Parse(Console.ReadLine());
Console.WriteLine("Введите последнее число из ряда (1..M) и нажмите Enter");
m = byte.Parse(Console.ReadLine());
Sequence = new byte[n]; //массив в котором будет храниться очередная последовательность
bool yes;
void Next(byte[] sequence)
{
int i = n - 1;
while ((i > -1) && (sequence[i] == m))
{
sequence[i] = 1;
i--;
}
yes = i > -1;
//если очередной элемент в последовательности можно нарастить
if (yes)
{
sequence[i]++;
}
}
//задаем первую последовательность, например, (1,1,1,1)
for (int i = 0; i < n; i++)
{
Sequence[i] = 1;
}
//пробуем перебрать все последовательности
do
{
//выводим счётчик очередной последовательности (стартуем с 1)
Console.Write($"{counter}: ");
counter++;
//выводим на экран очередную последовательность
for (int i = 0; i < n; i++)
{
Console.Write($"{Sequence[i]} ");
}
Console.WriteLine();
//пробуем найти следующую последовательность
Next(Sequence);
}
while (yes);
}
}
Результат работы программы представлен ниже:
3
Введите последнее число из ряда (1..M) и нажмите Enter
2
1: 1 1 1
2: 1 1 2
3: 1 2 1
4: 1 2 2
5: 2 1 1
6: 2 1 2
7: 2 2 1
8: 2 2 2
Как видите, программа вывела ровно M^N (2^3 = 8) последовательностей.
Готовый проект C# вы можете скачать из нашего репозитория на GitHub.
Итого
Сегодня мы научились искать все последовательности заданной длины состоящие из чисел от 1 до M. В работе мы использовали массивы, циклы for, while и do..while и для вывода строк воспользовались интерполяцией.