2

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

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

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

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

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

4

1 回答 1

12

一种方法如下:

给团队编号 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 的任何一天处理第一个索引点。

于 2014-10-20T17:30:30.317 回答