代码之家  ›  专栏  ›  技术社区  ›  Aaron M

帮助创建日程生成器

  •  0
  • Aaron M  · 技术社区  · 16 年前

    我正在做一个让我感兴趣一段时间的编程练习。这个练习的目的是通过编程生成一个赛季的垒球时间表。我要找的是一般性的建议,而不是具体的建议,因为我正试图在这个过程中学习一些东西。

    我正在努力完成的程序的一部分是如何生成在一个晚上玩的所有游戏。这是我在第一次交互中尝试实现的基本功能。

    问题: 给定一个团队列表,生成一个让每个团队玩两场游戏的时间表,并且没有一个团队可以在一个晚上玩两次同一个团队。

    4 回复  |  直到 16 年前
        1
  •  2
  •   Aaron M    16 年前

    我使用了我在维基百科上为《循环罗宾》找到的实现方法。 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
    
        2
  •  1
  •   John Fouhy    16 年前

    似乎你只需旋转你的团队列表就可以做到这一点。

    例如,给定团队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
    

    九场比赛将给你一个完整的循环,然后你可以重新开始。把比赛分成两组进行你的夜间配对。

    编辑

    基洛坦指出,这实际上并不奏效,因为它让每支球队同时打两次球。哎呀。如果你想出了真正有用的东西,我鼓励你把它贴出来并接受它。

        3
  •  0
  •   Juha Syrjälä    16 年前

    使用这种循环。你把队伍围成一个圈,然后把圈转过来。

    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
    
        4
  •  0
  •   Waleed Al-Balooshi    16 年前

    下面的解决方案可能不是最好的,但是看看它是否适合您。

    我先创建一个结构来保存每个游戏

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

    现在,您可以创建一个方法来从列表中选择游戏。一旦选择了一个游戏,将游戏场改为“真”,以知道您不应该再选择这场比赛。或者你可以把游戏从列表中删除。

    你说你需要指导,这就是为什么我没有创造出挑选游戏的方法。

    希望这有帮助。