Я занимался многими исследованиями по этой теме, и, хотя у меня было много вопросов, похожих на мои, я не совсем нашел ответ, который я ищу. Я создаю скопированный турнир с одиночными исключениями. Правила для этого типа кронштейнов гласят, что две лучшие команды будут играть в финале. Так, например, если бы у нас было 8 команд с лучшей командой, а Team 8 - хуже.Создание скошенного кронштейна для турнира
Если бы мы имели 8 команд это приведет:
раунда 1 =========> Раунд 2 =========> Раунд 3
команды 1 против команды 8
Команда 4 против команды 5 ==> Команда 1 против команды 4 ==> Команда 1 Команда 2 против
команды 3 против Team 6 ==> Team 3 против команды 2
Команда 2 Команда против 7
Обращаем внимание на заказ t в первом раунде, поскольку мой вопрос будет развиваться вокруг правильного порядка команд. Вы увидите, что команда 1 находится на вершине, а команда 2 - внизу.
Теперь я понял простую функцию, которая будет пара команд в 1-м раунде, чтобы произвести правильные матчей:
//Bracket Structure represents the order of teams in which they should be printed in round 1 for specific number of teams.
//As you see I have to manually specify for each team size, I wish to write an algorithm that will calculate this for me so that I do not have a maximum teams restriction.
private static readonly Dictionary<int, int[]> BracketStructure = new Dictionary<int, int[]>
{
//2 is number of teams, 0 represents the team in the array, so 0 is actually team 1, 1 is team 2, etc...
{ 2, new [] { 0 } },
{ 4, new [] { 0, 1} },
{ 8, new [] { 0, 3, 2, 1} },
{ 16, new [] { 0, 7, 4, 3, 2, 5, 6, 1} },
{ 32, new [] { 0, 15, 7, 8, 3, 12, 4, 11, 1, 14, 6, 9, 2, 13, 5, 10 }},
{ 64, new [] { 0, 31, 16, 15, 8, 23, 24, 7, 3, 28, 19, 12, 11, 20, 27, 4, 1, 30, 17, 14, 9, 22, 25, 6, 2, 29, 18, 13, 10, 21, 26, 5 }}
};
private static void CreateMatchups(int totalTeams)
{
var teams = new List<int>();
var matchups = new List<string>();
var c = 1;
while (totalTeams >= c)
{
teams.Add(c);
c++;
}
for (var i = 0; i < teams.Count/2; i++)
{
matchups.Add(teams[i] + " vs " + teams[totalTeams - (i + 1)]);
}
PrintBracket(matchups, BracketStructure[totalTeams]);
}
private static void PrintBracket(IReadOnlyList<string> matchups, IEnumerable<int> teams)
{
foreach (var team in teams)
{
Console.WriteLine(matchups[team]);
}
}
Проблема с выше кода является то, что он не будет печатать их в правильном порядке. Заказ будет:
команды 1 против команды 8
команда 2 Team против 7
команды 3 против команды 6
Команда 4 против Команда 5
я не могу прийти с алгоритмом, который будет сортировать их по-посеянному. Это нужно, чтобы работать в любом месте в форме турнира из двух человек на любое количество действительно ... Любая помощь или совет по этому поводу очень ценится.
Я основывали свою упорядоченность на http://www.printyourbrackets.com/
я это первоначально на https://softwareengineering.stackexchange.com/, но мне сказали, переполнение стека является правильным местом для этого вопроса, так что я отправляю его здесь вместо этого.
Для получения дополнительной информации о том, что затравки кронштейн, вы можете прочитать здесь: https://en.wikipedia.org/wiki/Seed_(sports)
EDIT:
Я наткнулся на это, как я делал больше исследований: https://jsfiddle.net/vrnb16r9/1/
напечатанных Игры там в правильном порядке, ну почти, но я считаю, что его формула там все еще точна.Например, приведенный выше пример 8-й команды будет напечатан следующим образом:
Раунд 1 =========> Круглый 2 =========> Круглый 3
команды 1 против команды 8
Команда 4 против команды 5 ==> Team 1 против команды 4 ==> Команда 1 Команда 2 против
команды 3 против Team 6 ==> Команда 3 против команды 2
команды 2 против команды 7
Однако его формула печатает ее, как это:
Круглый 1 =========> Круглые 2 =========> Круглые 3
команды 1 против команды 8
Команда 4 против команды 5 ==> Team 1 против команда 4 ==> команда 1 команда 2 против
команды 2 против команды 7 ==> Team 2 против команды 3
команды 3 против команды 8
Обратите внимание, что команда 2 вывозится раз и команда 3 снизилась один раз? Хотя его формула по-прежнему приводит к правильным спариваниям в каждом раунде, у него нет 100% правильного порядка. Я понимаю, что он просто поменял позицию двух команд, и это в конечном счете не имеет значения, потому что, несмотря ни на что, в следующем раунде будут правильные совпадения. Однако мне все равно хотелось бы выяснить, как их получить в точном порядке, который они предполагают , так же, как и на печатной ссылке, которую я дал выше. Я считаю, что его подход находится в правильном направлении, выясняет победителя и прокладывает себе путь назад, однако мне трудно понять его код.
EDIT 2:
Я начал щедроты, потому что я все еще очень потерял с этим и был очень мало удач воедино логики. Я в основном надеюсь получить пример кода C# о том, как достичь того, что я обсуждал выше.
Что такое правильный порядок его ? Я вижу заказ, который вы отправили в начале, но я не могу определить критерии, которые вы использовали для этого. Вы говорите о «лучшем» и «худшем», но это будет только от второго раунда, нет? – Gusman
@Gusman посмотри мой первый 8-го человека, который имеет 3 раунда, то есть правильный выход. Смотрите, потому что в раунде 2 команда 1 должна играть против команды 4, тогда следующий набор игр должен быть тем, что включает в себя команду 4. Его просто кронштейн, и я пытаюсь выяснить порядок. – Bojan
Какова ваша логика для команды 1, играющей в команду 4 вместо команды 2? –