循环算法实现Java

时间:2014-10-20 17:27:11

标签: java algorithm round-robin

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

我需要制定一个运动队计划,其中n个队(在这种情况下,10个队)以循环赛形式进行比赛。规则遵循基本的循环格式,其中一个团队只能在给定时间玩另一个团队,并且所有团队必须一次玩所有其他团队。

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

我不是在寻找一个讲义,而是寻求一些帮助,以创造性的方式看待这个算法,这样我就可以转换顺时针移动团队的概念。

我感谢所有的帮助,并且很乐意回答在我最初的问题中可能令人困惑的任何事情。谢谢!

1 个答案:

答案 0 :(得分:7)

一种方法是:

团队数量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.