我在实现这个小循环项目方面遇到了一些麻烦。我想做的是生成游戏的预览日历
然后我想输出;
第1天:第1队对第2队;第3队对第4队;第5小组对第6小组;
第2天1队vs 4队;第6队对第3队;第2队对第5队;
直到冠军结束;
这是我到目前为止的代码,但是当数组的其余部分旋转时,我很难让第一支队伍修复…:
static void Main(string[] args) { string[] ListTeam = new string[] {"Equipe1", "Equipe2", "Equipe3", "Equipe4", "Equipe5", "Equipe6"}; IList<Match> ListMatch = new List<Match>(); it NumberOfDays = (ListTeam.Count()-1); int y = 2; for (int i = 1; i <= NumberOfDays; i++) { Console.WriteLine("\nDay {0} : \n",i); Console.WriteLine(ListTeam[0].ToString() + " VS " + ListTeam[i].ToString()); for (y =ListTeam.Count(); y>0 ; y--) { Console.WriteLine(ListTeam[y].ToString() + " VS " + ListTeam[y+1].ToString()); y++; } } }
编辑:我在Java中找到一个代码示例,但我无法翻译…
使用模块化算法可以很容易做到这一点:
更新2 :( 如所承诺的正确算法)
public void ListMatches(List<string> ListTeam) { if (ListTeam.Count % 2 != 0) { ListTeam.Add("Bye"); } int numDays = (numTeams - 1); int halfSize = numTeams / 2; List<string> teams = new List<string>(); teams.AddRange(ListTeam.Skip(halfSize).Take(halfSize)); teams.AddRange(ListTeam.Skip(1).Take(halfSize -1).ToArray().Reverse()); 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
(day + idx) % numDays
day
(day + (numDays - idx)) % numDays
更新3: 我不高兴我的解决方案涉及到数组元素的这种复杂选择,匹配和反转。在考虑了解决方案涉及的内容之后,我意识到我太想保持团队的秩序了。但是,这不是必需的,并且不必关心初始订购即可获得不同但同样有效的时间表。重要的是我在解释的第二部分中描述的选择算法。
因此,您可以简化以下几行:
teams.AddRange(ListTeam.Skip(halfSize).Take(halfSize)); teams.AddRange(ListTeam.Skip(1).Take(halfSize -1).ToArray().Reverse());
至:
teams.AddRange(ListTeam); // Copy all the elements. teams.RemoveAt(0); // To exclude the first team.