我认为我的问题相当简单,但我觉得我需要一些不同的观点,因为我似乎无法将此算法转换为代码。
我需要制定一个运动队计划,其中n个队(在这种情况下,10个队)以循环赛形式进行比赛。规则遵循基本的循环格式,其中一个团队只能在给定时间玩另一个团队,并且所有团队必须一次玩所有其他团队。
我发现算法是将团队1保持在现场,并顺时针旋转其余部分。虚拟团队可用于处理n的奇数。问题出现在算法的“顺时针”部分。我不知道如何将顺时针旋转的概念转换为我的团队。例如,如果我让它们在数组TeamArray中拆分,TeamArray [0]在第1周播放TeamArray [10]等,我怎样才能让它们在第2周顺时针移动?
我不是在寻找一个讲义,而是寻求一些帮助,以创造性的方式看待这个算法,这样我就可以转换顺时针移动团队的概念。
我感谢所有的帮助,并且很乐意回答在我最初的问题中可能令人困惑的任何事情。谢谢!
答案 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.