2017-03-01 2 views
0

나는 첫 번째 게임을 만들고 몇 가지 문제가 발생했습니다. 필자는 항상 7 개의 타일을 가지고 있으며 모든 가능한 조합을 만들 필요가 있습니다 (최대 5040) 파일의 예 : 13 01 02 24 14 12 25 숫자는 13면과 같은면에 몇 개의 숫자가 있는지를 나타냅니다. 3 도트가 있습니다. 결과 예 :C# 도미노 게임에서 가능한 모든 조합 찾기

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); 
      } 
     } 
    } 
+0

시도한 재귀를 왜 보여주지 않습니까? – Sam07

답변

0

, 31 10 02 24 41 12 253 1 0 2 4 1 2 5 같은 것, 당신이 7 개 타일을 가지고 있지만, 그들은 단지 값 때문에 8 개 고유 한 값을 가질 수 있습니다 그들의 측면에서 일치해야합니다.

그래서 아마도 올바른 길로 인도합니다. 마지막으로, 당신은 5040 가지 이상의 조합을 가질 것입니다 : 7 개의 다른 값을 가진 8 개의 숫자 = 7^8 = 5,764,801 개의 다른 조합. 중복 된 타일을 허용하는 경우에 해당됩니다. 그렇지 않다면 다른 답변에서 얻을 수있는 조합의 수를 나타냅니다.

그러나 두 경우 모두 메모리에 유지하려고하지 않는 것이 좋습니다.