2009-08-03 111 views
0

我正在进行一段时间对我感兴趣的编程练习。此练习的目标是以编程方式为季节生成垒球时间表。我正在寻找的是一般性建议,而不是特定的建议,因为我正在尝试在过程中学习一些东西。帮助创建计划生成器

我真的很苦恼的一部分是如何生成一个晚上玩的所有游戏。这是我试图在第一次交互中实现的基本功能。

问题: 给出一个团队列表,生成一个时间表,每个团队玩2场比赛,并且没有球队可以在一个晚上两次玩同一个球队。

回答

2

我去,我在维基百科上发现循环赛实施 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..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 

所以在游戏中一个,一队队扮演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 

9场比赛会给你一个完整的圆-robin,然后你可以从头开始。成对的比赛为你的夜间比赛。

编辑

Kylotan指出,这实际上并不工作,因为它的每队一次打两次。哎呀。如果你想出了一些真正有用的东西,我鼓励你发布它并接受它:-)

+0

我知道必须有一个简单而优雅的解决方案来解决这个问题。这克服了几个挑战中的第一个。 – 2009-08-03 15:07:22

+0

我实现了这个解决方案,它工作。我认为唯一的问题是它看起来太过计算机生成,但这是我可以生活的东西 – 2009-08-04 12:05:35

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 
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(); 
    } 
} 

然后,我创建comtains的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,以知道不应再次选择该匹配。或者你可以从列表中删除游戏。

你说你想得到指导,这就是为什么我没有创建出游戏的方法。

希望这有助于。