Определить все возможные расположения вагонов и локомотива на прямом отрезке железнодорожного пути - C#
Формулировка задачи:
Доброго времени суток.
У меня такая задача:
Локомотив А и вагоны стоят на железнодорожном пути, приведенном ниже, в порядка (слева направо). Локомотив можно произвольно отцеплять и прицеплять с отдельными вагонами, стрелки могут приобретать произвольного положения и локомотив может тянуть или толкать вагон, к которому он прицеплен. Необходимо определить все возможные расположения вагонов и локомотива на прямом отрезке железнодорожного пути.
Допускаем у меня есть локомотив А и вагоны B,C,D.
Комбинация должна выглядеть так: AB, AC, AD, BAC, BAD, CAB, CAD, DAC, DAB, на сколько я понял.
Вот код который я написал.
Как сделать так, что бы оно создавало комбинации?
Если можно то пожалуйста с объяснением.
Листинг программы
- class Program
- {
- static void Main(string[] args)
- {
- Console.WriteLine("Задача про локомотив");
- Console.WriteLine("Введите количество вагонов");
- int quantity = Convert.ToInt32(Console.ReadLine());
- Console.WriteLine("За локомотив принимаем А");
- string[] alphabet = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
- string[] cars = new string[quantity]; //количество вагонов соответствует количеству элементов в массиве
- string[] depot;//депо
- for (int i = 0; i < cars.Length; i++)
- {
- cars[i] = alphabet[i];
- }
- Console.ReadLine();
- }
Решение задачи: «Определить все возможные расположения вагонов и локомотива на прямом отрезке железнодорожного пути»
textual
Листинг программы
- //init
- Dictionary<int, char> mask = new Dictionary<int, char> {
- {0,'0'},
- {1,'A'},
- {2,'B'},
- {3,'C'},
- {4,'D'},
- };
- //data
- int[] values = new int[mask.Count - 1];
- List<string> allValues = new List<string>((int)Math.Pow(mask.Count, mask.Count - 1));
- for (int i = 0, degree = 0; i < Math.Pow(mask.Count, mask.Count - 1); i++)
- {
- string rval = String.Empty;
- foreach (var t in values) rval += mask[t];
- allValues.Add(rval);
- values[degree]++;
- for (int j = 0; j < values.Length; j++)
- if (values[j] == mask.Count)
- {
- values[j] = 0;
- if (j + 1 < values.Length) values[j + 1]++;
- }
- }
- //result
- var result = from _ in (from _ in allValues
- where _.Contains('A')
- let res = _.Replace("0", String.Empty)
- where res.Distinct().Count() == res.Count()
- select res).Distinct()
- orderby _
- select _;
- foreach (var r in result) Console.WriteLine(r);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д