java - 循环算法实现Java

标签 java algorithm round-robin sports-league-scheduling-problem

我认为我的问题相当简单,但我觉得我需要一些不同的观点,因为我似乎无法将这个算法转化为代码。

我需要制定一个运动队赛程表,其中 n 支球队(在本例中为 10 支球队)以循环赛的形式进行比赛。规则遵循基本的循环赛形式,其中一支球队在给定时间只能与另一支球队比赛,并且所有球队都必须与所有其他球队比赛一次。

我发现算法是让第 1 队留在原地,然后顺时针旋转其余队伍。虚拟团队可用于处理 n 的奇数。问题出现在算法的“顺时针”部分。我不知道如何将顺时针轮换的概念转化为我的团队。例如,如果我让他们在第 1 周将其拆分为一个数组 TeamArray,TeamArray[0] 播放 TeamArray[10],等等,我怎样才能让他们在第 2 周顺时针移动?

我不是在寻找讲义答案,而是在寻找一些帮助以创造性的方式查看此算法,以便我可以翻译顺时针移动团队的概念。

我感谢所有的帮助,并且很乐意回答任何可能让我最初的问题感到困惑的问题。谢谢!

最佳答案

一种方法如下:

将团队编号为 1..n。 (本例中 n=8) 将所有团队写成两行。

列显示哪支球队将参加该轮比赛(1 对 8、2 对 7,...)。

1 2 3 4
8 7 6 5

现在,保持 1 组不变,但轮换(顺时针)所有其他组。在第 2 周,您将获得

1 8 2 3
7 6 5 4

在第 3 周,您将获得

1 7 8 2
6 5 4 3

这将持续到第 n-1 周,在这种情况下,

1 3 4 5
2 8 7 6

如果 n 是奇数,做同样的事情,但添加一个虚拟团队。谁与虚拟团队匹配,谁就在那周轮空。

例如:

1 2 3 4 5
9 8 7 6 0         (0 being the bye)

如上继续旋转。

代码示例:

void ListMatches(List<string> ListTeam)
{
    if (ListTeam.Count % 2 != 0)
    {
        ListTeam.Add("Bye"); // If odd number of teams add a dummy
    }

    int numDays = (numTeams - 1); // Days needed to complete tournament
    int halfSize = numTeams / 2;

    List<string> teams = new List<string>();

    teams.AddRange(ListTeam); // Add teams to List and remove the first team
    teams.RemoveAt=(0);

    int teamsSize = teams.Count;

    for (int day = 0; day < numDays; day++)
    {
        Console.WriteLine("Day {0}", (day + 1));

        int teamIdx = day % teamsSize;

        Console.WriteLine("{0} vs {1}", teams[teamIdx], ListTeam[0]);

        for (int idx = 1; idx < halfSize; idx++)
        {               
            int firstTeam = (day + idx) % teamsSize;
            int secondTeam = (day  + teamsSize - idx) % teamsSize;
            Console.WriteLine("{0} vs {1}", teams[firstTeam], teams[secondTeam]);
        }
    }
}

基本上,这样做是将除第一个团队之外的所有团队放入列表中。接下来,每天将您开始的索引增加 1。对于您关注的这支球队,您将这支球队与 Team1 相匹配。对于列表中的下一个团队,您将其与从列表另一端开始的相同索引匹配,但在任何一天处理第一个索引点+1。

关于java - 循环算法实现Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26471421/

相关文章:

java - RegEx——解析 ${ } 之间的字符串,但不解析 '${ }' 之间的字符串

java - 在文件夹中查找不带扩展名的图片

algorithm - 圆圈碰撞问题

php - 排序和过滤依赖项

string - 关于KMP算法预处理函数实现

java - 循环java实现

java - 将特定格式 'Struct of Array of Structs'的JSON文件解析为spark dataframe

c - CPU 调度的大时间量与小量?

c# - C#中的循环数组

java - Eclipse - `open call hierarchy` 得到了错误的结果