Создайте график для турнира с круговым движением в 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);
}
