Создайте график для турнира с круговым движением в C#
Функция GenerateRoundRobinOdd возвращает массив, где results [i, j] дает противнику команды i в round j раунда турнира. Эта функция работает только для нечетного числа команд. Ссылка выше объясняет метод.
private const int BYE = -1; // Возвращаем массив, в котором результаты (i, j) дают // противник команды i в раунде j. // Примечание: num_teams должно быть нечетным. private int [,] GenerateRoundRobinOdd(int num_teams) { int n2 = (int)((num_teams - 1) / 2); int[,] results = new int[num_teams, num_teams]; // Инициализировать список команд. int[] teams = new int[num_teams]; for (int i = 0; i < num_teams; i++) teams[i] = i; // Начнем раунды. for (int round = 0; round < num_teams; round++) { for (int i = 0; i < n2; i++) { int team1 = teams[n2 - i]; int team2 = teams[n2 + i + 1]; results[team1, round] = team2; results[team2, round] = team1; } // Установите команду с байтом. results[teams[0], round] = BYE; // Поворот массива. RotateArray(teams); } return results; }
Вспомогательная функция RotateArray вращает элементы в массиве команд. Алгоритм вызывает эту процедуру после каждого раунда. Р>
// Поворачиваем записи в одну позицию. private void RotateArray(int[] teams) { int tmp = teams[teams.Length - 1]; Array.Copy(teams, 0, teams, 1, teams.Length - 1); teams[0] = tmp; }
Функция GenerateRoundRobinEven возвращает аналогичный массив для четного числа команд. Он вызывает GenerateRoundRobinOdd, чтобы составить расписание для турнира с одним меньшим количеством команд. Затем он расширяет массив результатов и заменяет байты дополнительной командой. См. Ссылку выше для более полного объяснения.
private int[,] GenerateRoundRobinEven(int num_teams) { // Создаем результат для меньшего количества команд. int[,] results = GenerateRoundRobinOdd(num_teams - 1); // Скопируем результаты в массив большего размера, // заменяем байты дополнительной командой. int[,] results2 = new int[num_teams, num_teams - 1]; for (int team = 0; team < num_teams - 1; team++) { for (int round = 0; round < num_teams - 1; round++) { if (results[team, round] == BYE) { // Изменим бай до новой команды. results2[team, round] = num_teams - 1; results2[num_teams - 1, round] = team; } else { results2[team, round] = results[team, round]; } } } return results2; }
Функция GenerateRoundRobin просто вызывает функции GenerateRoundRobinOdd и GenerateRoundRobinEven в зависимости от того, является ли количество команд нечетным или четным.
private int[,] GenerateRoundRobin(int num_teams) { if (num_teams % 2 == 0) return GenerateRoundRobinEven(num_teams); else return GenerateRoundRobinOdd(num_teams); }