На самом деле я сам разработал это довольно недавно и наткнулся (то есть, я разработал это, но, возможно, оно было обнаружено ранее) на аккуратное рекурсивное решение.
Вы начинаете со своего списка игроков,в списке, отсортированном в порядке заполнения .Это будет важно позже.
Общий алгоритм состоит из разделения списка игроков на два и последующего создания двух суб-турниров.Победители двух под-турниров заканчивают гранд-финал всего турнира.
Обязательные объекты
- Игрок
- Матч
- Домашний игрок
- Игрок на выезде
- Следующий матч (указатель на матч с победителем)
Разделение списков
В большинстве турниров в первом раунде игрок с высевшими противниками ставится против игрока с низкими сеяными.Чтобы сделать это, я использовал следующий алгоритм, но вы могли бы просто поместить первых n / 2
игроков в один список, а остальных в другой список, чтобы создать турнир, в котором семена 1 и 2 разыгрываются в первом раунде (и семян 3играет 4, 5 играет 6 и т. д.).
Здесь я отмечу, что при использовании верхнего алгоритма в нижнем семени есть преимущество, заключающееся в том, что с этим алгоритмом, если у вас нет двух игроков,лучшие семена получат прощание в ранних раундах.
- Возьмите первого игрока и поместите его в «левый» список
- Возьмите следующих двух игроков (илипоследний игрок) и поместите их в «правый» список
- Возьмите следующих двух игроков и поместите их в «левый» список
- Повторяйте с шага 2, пока не останется больше игроков.
Конечно, если в списке всего два игрока, вы просто создаете матч между ними и возвращаетесь.
Создание турнира
Итак, вы начинаетесо списком скажем, 64 игрока.Вы разделяете его на два списка из 32 игроков и рекурсивно создаете два суб-турнира.Методы, которые вы вызываете рекурсивно, должны возвращать совпадения, представляющие грандиозный финальный матч суб-турнира (полуфинал вашего общего турнира).Затем вы можете создать матч, который станет грандиозным финалом вашего общего турнира, и установить nextMatch
полуфинальных матчей как этот грандиозный финал.
Что следует учитывать
- Вам нужно будет отказаться от повторения, если в списке есть только два игрока.
- Если ваш сплит дает вам список из одного, не стоит повторяться с ним.Просто создайте под-турнир с другим списком (в нем должно быть только два игрока, поэтому он сразу же вернется с матчем), установите в качестве домашней команды одиночника и
nextMatch
в под-турнире. - Если вы хотите отслеживать раунды, вам нужно передать целое число глубины рекурсии - увеличивать его при создании под-турнира.
Надеюсь, это поможет, позвольте мнезнать, если вам нужны какие-либо разъяснения:)