C#在多米诺骨牌游戏中找到所有可能的组合

时间:2017-03-01 18:56:59

标签: c#

我创造了我的第一个游戏并遇到了一些问题。 我总是有7个瓷砖,我需要做所有可能的组合(最多5040) 文件示例:13 01 02 24 14 12 25数字表示每侧有多少个数字,例如13个一个图块边有1个点,另一个有3个点。 结果示例:

31 10 02 24 41 12 25     
52 21 14 42 20 01 13      
31 12 24 41 10 02 25     
52 20 01 14 42 21 13      
...

我该怎么做?我尝试使用递归但没有工作 这就是我所拥有的:

    class Kauliukas
{
    public int Dalis1 { get; set; }
    public int Dalis2 { get; set; }

    public Kauliukas(int dalis1, int dalis2)
    {
        Dalis1 = dalis1;
        Dalis2 = dalis2;
    }

    public Kauliukas()
    {

    }

}

class KauliukuKonteineris
{
    public const int MaxIlgis = 7;
    private Kauliukas[] Kauliukai = new Kauliukas[MaxIlgis];
    public int Count { get; set; }

    public KauliukuKonteineris(int size)
    {
        Kauliukai = new Kauliukas[size];
    }
    public void Add(Kauliukas kauliukas)
    {
        Kauliukai[Count++] = kauliukas;
    }
    public Kauliukas Get(int index)
    {
        return Kauliukai[index];
    }

}

class Grandine
{
    public static int MaxIlgis = 7;
    private Kauliukas[] Kauliukai = new Kauliukas[MaxIlgis];
    public int Count { get; set; }

    public Grandine(int size)
    {
        Kauliukai = new Kauliukas[size];
    }
    public void Add(Kauliukas kauliukas)
    {
        Kauliukai[Count++] = kauliukas;
    }
    public Kauliukas Get(int index)
    {
        return Kauliukai[index];
    }
}

class GrandiniuKonteineris
{
    public const int MaxGrandines = 5040;
    private Grandine[] Grandines = new Grandine[MaxGrandines];
    public int Count { get; set; }

    public GrandiniuKonteineris(int size)
    {
        Grandines = new Grandine[size];
    }
    public void Add(Grandine grandine)
    {
        Grandines[Count++] = grandine;
    }
    public Grandine Get(int index)
    {
        return Grandines[index];
    }
}

class Program
{
    public const int MaxKauliuku = 7;
    public const string DataFile = "Kur3.txt";
    public const int MaxGrandiniu = 5040;
    static void Main(string[] args)
    {

        KauliukuKonteineris Duomenys = new KauliukuKonteineris(MaxKauliuku);
        Skaitymas(Duomenys);
        GrandiniuKonteineris Rezultatai = new GrandiniuKonteineris(MaxGrandiniu);
        GrandiniuSudarymas(Duomenys, Rezultatai);
    }

    /// <summary>
    /// Duomenu nuskaitymas is failo ir sukelimas i konteinerine klase
    /// </summary>
    /// <param name="Duomenys"></param>
    public static void Skaitymas(KauliukuKonteineris Duomenys)
    {
        using (StreamReader reader = new StreamReader(DataFile))
        {
            string line = reader.ReadLine(); // Nuskaitoma visa eilute
            string[] values = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); // Padalina skaicius
            for(int i=0; i<values.Length; i++)
            {
                int dalis1 = int.Parse(values[i]) / 10; // Dvizenkli skaciu padalinus is 10 gaunamas skaitmuo esantis pirmoje pozicijoje
                int dalis2 = int.Parse(values[i]) % 10; // Dvizenklio skaiciaus padalinto is 10 liekana - skaitmuo antroje pozicijoje
                Kauliukas kauliukas = new Kauliukas(dalis1, dalis2);
                Duomenys.Add(kauliukas);
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

事实上,31 10 02 24 41 12 253 1 0 2 4 1 2 5相同,你有7个图块,但它们只能有8个不同的值,因为值必须在它们的边上匹配。

所以也许这会以正确的方式引导你。最后,您将拥有超过5040种组合:8个数字,7个不同的值= 7 ^ 8 = 5,764,801种不同的组合。如果您允许重复的图块,则为真。如果没有,则在另一个答案中显示您将获得多少组合。

然而,在任何一种情况下,我都不建议将它们留在记忆中。

相关问题