我正在进行一项对我感兴趣的编程练习。本练习的目标是以编程方式为季节生成垒球计划。我正在寻找的是一般建议,而不是特定的建议,因为我正在尝试在这个过程中学到一些东西。
我真正挣扎的程序的一部分是如何生成一夜之间播放的所有游戏。这是我在第一次交互中尝试实现的基本功能。
问题: 给出一个团队列表,生成一个每个团队玩2场比赛的时间表,没有一个团队可以在一个晚上两次打同一个团队。
答案 0 :(得分:2)
我选择了我在维基百科上为Round Robin找到的实现 http://en.wikipedia.org/wiki/Round-robin_tournament
循环赛的标准算法是为每个参赛者分配一个号码,并在第一轮中将它们配对......
1 2 3 4 5 6 7
14 13 12 11 10 9 8
...然后修复一个竞争对手(本例中为第一个)并顺时针旋转其他竞争对手......
1 14 2 3 4 5 6
13 12 11 10 9 8 7
1 13 14 2 3 4 5
12 11 10 9 8 7 6
......直到你几乎回到初始位置
1 3 4 5 6 7 8
2 14 13 12 11 10 9
答案 1 :(得分:1)
看起来你只需旋转你的团队名单就可以做到这一点。
e.g。给团队1..10,做到这一点:
Team A: 1 2 3 4 5 6 7 8 9 10
Team B: 2 3 4 5 6 7 8 9 10 1
所以在第一场比赛中,A队打B队。对于第二场比赛,再次轮换:
Team A: 1 2 3 4 5 6 7 8 9 10
Team B: 3 4 5 6 7 8 9 10 1 2
九场比赛会给你一个完整的循环赛,然后你可以从头开始。为你的夜间比赛成对进行比赛。
修改
Kylotan指出,这实际上并不奏效,因为它让每支球队一次打两次。哎呀。如果你想出了一些真正有效的东西,我建议你发布并接受它: - )
答案 2 :(得分:0)
使用这种流通。你让团队保持一个响铃并旋转环。
Team A: 1 2 3
Team B: 4 5 6
Team A: 4 1 2
Team B: 5 6 3
Team A: 5 4 1
Team B: 6 3 2
Team A: 6 5 4
Team B: 3 2 1
Team A: 3 6 5
Team B: 2 1 4
答案 3 :(得分:0)
以下解决方案可能不是最佳解决方案,但请查看它是否适合您。
我首先创建一个结构来保存每个游戏
public struct Game {
private int TeamA;
private int TeamB;
private bool GamePlayed;
// I am adding this to quickly see what team is playing. I used this for debugging
// purposes to make sure the same team doesn't play another team twice.
public override ToString() {
return TeamA.ToString() + " vs. " + TeamB.ToString();
}
}
然后我创建一个列表,其中包含10个队伍互相比赛的所有不同组合。应该有45个。
List<Game> AllGamesInSchedule = new List<Game>();
for (int i = 1; i <= 10; i++) {
for (int j = (i + 1); j <= 10; j++) {
AllGamesInSchedule.Add(new Game(i, j));
}
}
// This prints all the different game combinations out to the console to see
// that they are all different.
foreach (Game game in AllGamesInSchedule) {
Console.WriteLine(game.ToString());
}
现在,您可以创建一个从此列表中选择游戏的方法。挑选出游戏后,将GamePlayed字段更改为true,以便知道您不应该再次选择此匹配项。或者您可以从列表中删除游戏。
你说你想要指导,这就是为什么我没有创建选择游戏的方法。
希望这会有所帮助。