Meh*_*abC 0 java algorithm round-robin
我认为我的问题相当简单,但我觉得我需要一些不同的观点,因为我似乎无法将这种算法转化为代码.
我需要制定一个运动队计划,其中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
Run Code Online (Sandbox Code Playgroud)
现在,保持1固定,但旋转(顺时针)所有其他球队.在第2周,你得到
1 8 2 3
7 6 5 4
Run Code Online (Sandbox Code Playgroud)
在第3周,你得到
1 7 8 2
6 5 4 3
Run Code Online (Sandbox Code Playgroud)
这种情况持续到第n-1周,在这种情况下,
1 3 4 5
2 8 7 6
Run Code Online (Sandbox Code Playgroud)
如果n是奇数,那么做同样的事情但是添加一个虚拟团队.那个与虚拟团队相匹配的人在那个星期就会再见.
例如:
1 2 3 4 5
9 8 7 6 0 (0 being the bye)
Run Code Online (Sandbox Code Playgroud)
如上所述继续旋转.
代码示例:
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]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
基本上这样做是将除第一个之外的所有团队放在一个列表中.接下来,每天将您开始的索引增加1.对于您专注的团队,您将此团队与Team1相匹配.对于列表中的下一个团队,您将它与从列表另一端开始的相同索引匹配,但在任何一天处理第一个索引点为+ 1.