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

Источник: http://csharphelper.com/blog/2015/04/generate-a-schedule-for-a-round-robin-tournament-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector