2

私の問題はかなり単純だと思いますが、このアルゴリズムをコードに変換できないように見えるため、いくつかの異なる視点が必要だと感じています。

n チーム (この場合は 10 チーム) がラウンド ロビン形式でプレーするスポーツ チームのスケジュールを作成する必要があります。ルールは基本的なラウンドロビン形式に従います。この形式では、1 つのチームが特定の時間に他の 1 つのチームとしか対戦できず、すべてのチームが他のすべてのチームと 1 回対戦する必要があります。

アルゴリズムは、チーム 1 をその場で保持し、残りを時計回りに回転させることであることがわかりました。ダミーチームを使用して、n の奇数を処理できます。この問題は、アルゴリズムの「時計回り」の部分で発生します。時計回りに回転するという概念をチームにどのように翻訳できるかわかりません。たとえば、配列 TeamArray に分割し、TeamArray[0] が TeamArray[10] などを第 1 週にプレイする場合、第 2 週にそれらを時計回りに移動させるにはどうすればよいでしょうか?

私は配付資料の答えを探しているのではなく、このアルゴリズムを創造的な方法で見て、チームを時計回りに動かすという概念を翻訳できるようにするための助けを求めています.

私はすべての助けに感謝し、私の最初の質問で混乱を招く可能性のあるものは何でも喜んで答えます. ありがとう!

4

1 に答える 1

12

これを行う 1 つの方法は次のとおりです。

チームに 1..n の番号を付けます。(この例では n=8) すべてのチームを 2 行で記入してください。

列には、そのラウンドでどのチームがプレーするかが表示されます (1 対 8、2 対 7、...)。

1 2 3 4
8 7 6 5

ここで、1 つを固定したまま、他のすべてのチームを (時計回りに) ローテーションします。2週目に、あなたは得る

1 8 2 3
7 6 5 4

そして3週目に、あなたは得る

1 7 8 2
6 5 4 3

これは第 n-1 週まで続きます。この場合、

1 3 4 5
2 8 7 6

n が奇数の場合、同じことを行いますが、ダミー チームを追加します。ダミーチームと対戦した人は誰でも、その週に別れを告げます。

例えば:

1 2 3 4 5
9 8 7 6 0         (0 being the bye)

上記のように回転を続けます。

コード例:

void ListMatches(List<string> ListTeam)
{
    if (ListTeam.Count % 2 != 0)
    {
        ListTeam.Add("Bye"); // If odd number of teams add a dummy
    }

    int numDays = (numTeams - 1); // Days needed to complete tournament
    int halfSize = numTeams / 2;

    List<string> teams = new List<string>();

    teams.AddRange(ListTeam); // Add teams to List and remove the first team
    teams.RemoveAt=(0);

    int teamsSize = teams.Count;

    for (int day = 0; day < numDays; day++)
    {
        Console.WriteLine("Day {0}", (day + 1));

        int teamIdx = day % teamsSize;

        Console.WriteLine("{0} vs {1}", teams[teamIdx], ListTeam[0]);

        for (int idx = 1; idx < halfSize; idx++)
        {               
            int firstTeam = (day + idx) % teamsSize;
            int secondTeam = (day  + teamsSize - idx) % teamsSize;
            Console.WriteLine("{0} vs {1}", teams[firstTeam], teams[secondTeam]);
        }
    }
}

基本的に、これが行っていることは、最初のチームを除くすべてのチームをリストに入れることです。次に、開始時のインデックスを毎日 1 ずつ増やします。注目しているこのチームについて、このチームを Team1 と一致させます。リスト内の次のチームについては、リストの反対側から始まる同じインデックスに一致させますが、最初のインデックス スポットを + 1 として扱います。

于 2014-10-20T17:30:30.317 に答える