帮助创建计划生成器

时间:2009-08-03 02:57:19

标签: c# algorithm

我正在进行一项对我感兴趣的编程练习。本练习的目标是以编程方式为季节生成垒球计划。我正在寻找的是一般建议,而不是特定的建议,因为我正在尝试在这个过程中学到一些东西。

我真正挣扎的程序的一部分是如何生成一夜之间播放的所有游戏。这是我在第一次交互中尝试实现的基本功能。

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

4 个答案:

答案 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,以便知道您不应该再次选择此匹配项。或者您可以从列表中删除游戏。

你说你想要指导,这就是为什么我没有创建选择游戏的方法。

希望这会有所帮助。