我认为我的问题相当简单,但我觉得我需要一些不同的视角,因为我似乎无法将这个算法转化为代码。
我需要制定一个运动队赛程表,其中 n 支球队(在本例中为 10 支球队)以循环赛形式进行比赛。规则遵循基本的循环赛格式,其中一支球队在给定时间只能与另一支球队比赛,并且所有球队必须与所有其他球队比赛一次。
我发现算法是让第 1 队留在原地,然后顺时针旋转其余队。虚拟团队可用于处理 n 的奇数。问题出现在算法的“顺时针”部分。我不知道如何将顺时针轮换的概念转化为我的团队。例如,如果我让他们将其拆分为一个数组 TeamArray,并且 TeamArray[0] 在第 1 周播放 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 的任何一天。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)