2009-08-03 5 views
0

私は興味を持っているプログラミング演習に取り組んでいます。この練習の目標は、プログラム的に季節のソフトボールスケジュールを生成することです。私が探しているのは、その過程で何かを学ぼうとしているため、特定のアンカーではなく一般的なアドバイスです。スケジュールジェネレータを作成するのに役立つ

私が本当に苦労しているのは、ある夜に演奏されるすべてのゲームを生成する方法です。これは私が最初の介入で達成しようとしている基本的な機能です。

問題: チームのリストが与えられた場合、すべてのチームが2試合を行うようなスケジュールを生成します。チームは一晩中同じチームを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 
+0

私はこのコードでアルゴリズムを見たいと思っています... – ganders

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 

ので、ゲーム1で、チームAがゲーム2のためにチーム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試合はあなたにフルラウンドを与えます - ロビン、そしてあなたは最初からやり直すことができます。あなたの夜間のマッチアップのためにペアでゲームを取る。

EDIT

Kylotanは、それが一度二度遊ぶすべてのチームを持っているとして、これは実際には、動作しないことを指摘しています。おっとっと。あなたが本当にうまくいくものを考え出したら、それを投稿して受け入れることをお勧めします:-)

+0

私はこの問題の単純でエレガントな解決策がなければならないことが分かっていました。これはいくつかの課題のうちの最初のものを克服する。 –

+0

私はこのソリューションを実装しています。私は唯一の問題は、それもコンピュータで生成されているように見えるが、それは私が暮らすことができるものです –

+2

チーム1とチーム3に対してゲーム1のチーム2がプレーしていませんか? – Kylotan

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

次の解決策は、最適ではないかもしれませんが、あなたのために動作するかどうかを確認してください。

私はその後、私はお互いを再生する10チームのすべての異なる組み合わせをcomtainsリストを作成し、各ゲーム

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

を保持するための構造を作成することによって開始します。 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に変更して、この試合を再度選んではならないことを確認します。または、リストからゲームを削除することもできます。

あなたはガイダンスが必要だと言ったので、ゲームを選ぶ方法を作成しなかったのです。

これが役に立ちます。

関連する問題