0

次の問題に対する最善のアプローチは何かを理解しようとしています。

地図上にルートを描く必要があります。選択したい色の注文プールがあります。最初の色が利用可能であれば (まだ使用されていません)、その色を使用したいと考えています。最初の色が使用されたら、2 番目の色を使用したい、というように。また、描いたルートをグループ化することもできます。そのため、グループが同じ場合、それらは同じ色を共有する場合があります。

次に例を示します。

カラーリスト (注文事項): ブルー、レッド、グリーン、イエロー....

  • 最初のルートはグループ A です。ブルーが利用可能です: BLUE
  • 2 番目のルートはグループ B です。青は利用できません。赤が利用可能: 赤
  • 3 番目のルートはグループ A です。グループ A は既に Blue を使用しているため、次のように使用します: BLUE
  • 2 番目のルートは削除されます
  • 4 番目のルートはグループ C です。ブルーは利用できません。赤が利用可能: 赤
  • 5 番目のルートはグループ D です。青と赤は利用できません。グリーンが利用可能: GREEN

このタイプのシステムに最適なデータ構造は何かについて議論しています。色とその順序、どのグループが色を「チェックアウト」したか、いつ色を利用可能な選択肢のプールに「解放」できるかを維持する必要があります。

助言がありますか?

編集:

私の現在の戦略は、2 つのデータ構造を使用することです。最初は、キーがグループ名で、値が使用されている色である Dictionary になるため、現在誰がどの色を使用しているかがわかります。2 番目の構造は、使用可能な色の順序を維持するためのスタックになります。

そのため、新しいルートを追加したいときは、まず辞書にアクセスして、グループ名が存在するかどうかを確認します。そうであれば、その割り当てられた色を使用します。そうでない場合は、スタックから次に使用可能な色を取得し、その組み合わせをディクショナリに追加します。

これに関する問題は、色を使用して各グループにいくつのルートがあるかのカウントを維持しないことです。では、グループ A に Blue を使用する 2 つのルートがあるとします。ルートを削除します。まだ青を使用している別のグループ A ルートがあるかどうかを確認するにはどうすればよいですか? 青をスタックに戻すことができるかどうかはわかりません。

4

2 に答える 2

1

私のも似ていました。もっと掃除した方がいいのかな…

    class ColorAssigner
{
    public Dictionary<string, ColorGroupDetails> ColorAssignments { get; private set; }
    public SortedList<double, Color> Colors { get; private set; }

    public ColorAssigner()
    {
        ColorAssignments = new Dictionary<string, ColorGroupDetails>();
        Colors = new SortedList<double, Color>()  { { 1, Color.Blue}, {2, Color.Red}, {3,Color.Green}, {4,Color.Yellow} };
    }

    public Color RequestColor(string groupName)
    {
        if (ColorAssignments.ContainsKey(groupName)) 
        {
            ColorAssignments[groupName].Count++;
            return ColorAssignments[groupName].AssignedColor;
        }

        var assignedColor = GetNextAvailableColor();

        ColorAssignments.Add(groupName, new ColorGroupDetails() { Count = 1, AssignedColor = assignedColor });

        return assignedColor;
    }

    private Color GetNextAvailableColor()
    {
        var assignedColors = ColorAssignments.Select(a => a.Value.AssignedColor).ToList();

        return Colors.Values.Except(assignedColors).First();
    }

    public void ReleaseColor(string groupName)
    {
        if (ColorAssignments.ContainsKey(groupName))
        {
            var count = ColorAssignments[groupName].Count -= 1;

            if (count < 1) ColorAssignments.Remove(groupName);
        }
    }
}


    class ColorGroupDetails
    {
        public int Count { get; set; }
        public Color AssignedColor { get; set; }
    }
}
于 2013-02-27T19:16:57.080 に答える
0

Dictionaryaと aを使用してこれを達成できましたSortedList

internal class ColorUseCounter
{
    public ColorUseCounter(int ColorID, Color Color)
    {
        this.ColorID = ColorID;
        this.Color = Color;
        Count++;
    }

    public int ColorID { get; set; }
    public Color Color { get; set; }
    public int Count { get; set; }
}

private static Dictionary<double, ColorUseCounter> UsedColors = new Dictionary<double, ColorUseCounter>();
private static SortedList<int, Color> AvailableColors = new SortedList<int, Color>()
{
    { 1, Color.FromArgb(74, 117, 175) },
    { 2, Color.FromArgb(226, 134, 48) },
    { 3, Color.FromArgb(94, 158, 64) },
    { 4, Color.FromArgb(185, 58, 46) },
    ...
    ...
};

私のDictionary場合は double である GroupID をキーにしています。したがって、プロットするルートがある場合は、最初に GroupID が にあるかどうかを確認しますDictionary。そうであれば、ルートにその色を使用し、 を 1 増やして、その色を使用しているCountルートの数がわかるようにしColorます。

私の GroupID が にない場合、の優先順位をキーとして使用Dictionaryする my に移動します。そこで、 の最初のアイテムを取得し、GroupID と一緒に に追加します。次に、が利用できなくなったため、 を削除します。SortedListColorsSortedListDictionaryColorSortedList

ルートを削除するときは、がゼロになっているDictionaryかどうかを確認するだけです。もしそうなら、私はエントリCountを削除し、を に再挿入します。DictionaryColorSortedList

素晴らしい仕事。

于 2013-02-27T18:39:47.287 に答える