我认为我的问题相当简单,但我觉得我需要一些不同的观点,因为我似乎无法将这个算法转化为代码。
我需要制定一个运动队赛程表,其中 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/