Можно генерировать последовательности случайных чисел из цифр в c #? - PullRequest
0 голосов
/ 17 февраля 2019

stackoverflow community,

Я хочу создать приложение на c #, которое могло бы генерировать последовательность чисел (если последняя цифра предыдущего номера равна первой цифре второго номера).Например, у меня есть массив данных, который содержит: 20, 15, 25, 05, 53, 31, и мне нужно создать все возможные последовательности.

 So, in my case it should be: 
    20 05 53;
    02 25 53 31 15;
    15 53 31;
    25 53 31 15;
    and etc...

Цифры из указанных номеров можно поменять местами.В одной последовательности один и тот же номер может использоваться только один раз (например, 20 и 02, 15 и 51, они могут использоваться только один раз в одной последовательности). Ну, я пробовал несколько кодовых комбинаций, но ни одна из них не сработала...

for (int i = 0; i < data.Length; i++)
{
   string lastDigit = data[i].Substring(1, 1); // setting last digit of the first number
   string generatedSequence = "";
   for (int c = 0; c < data.Length; c++)
   {
     if (lastDigit == data[c].Substring(0, 1)) //if last digit of previous number equals to first digit of next number 
     {
        lastDigit = data[c].Substring(1, 1); // second digit of the number
        generatedSequence = generatedSequence + " " + data[c];
     }
   }
}

1 Ответ

0 голосов
/ 22 февраля 2019

Как вы и хотели, я перевел этот ответ на C #

Класс Domino: `

public class Domino {
    public Domino(int a, int b)
    {
        A = a;
        B = b;
    }
    public int A { get; set; }
    public int B { get; set; }


    public Domino Flipped()
    {
        return new Domino(B, A);
    }

    public override string ToString()
    {
        return $"[{A}/{B}]";
    }

}

Алгоритм:

    public static void GetList(List<Domino> chain, List<Domino> list)
    {
        for (int i = 0; i < list.Count; i++)
        {
            Domino domino = list[i];

            if (CanAppend(domino, chain))
            {
                chain.Add(domino);
                PrintList(chain);
                list.Remove(domino);
                //You need to create these two lists via the new keyword because 
                //we do not want to keep up the reference to the "old" list. 
                //Otherwise changes in the recoursion would also change the top-level list.
                GetList(new List<Domino>(chain), new List<Domino>(list));
                list.Insert(i, domino);
                chain.Remove(domino);
            }

            var flippedDomino = domino.Flipped();
            if (CanAppend(flippedDomino, chain))
            {
                chain.Add(flippedDomino);
                PrintList(chain);
                list.Remove(domino);
                GetList(new List<Domino>(chain), new List<Domino>(list));
                list.Insert(i, domino);
                chain.Remove(flippedDomino);
            }
        }
    }

два вспомогательных метода:

    public static bool CanAppend(Domino domino, List<Domino> items)
    {
        return items.Count == 0 || items.Last().B == domino.A;
    }
    private static void PrintList(List<Domino> items)
    {
        Console.WriteLine();
        foreach (var item in items)
        {
            Console.Write(item.ToString());
        }
    }

И вот как вы его используете:

List<Domino> list = new List<Domino>();    
// [3/4] [5/6] [1/4] [1/6]   
list.Add(new Domino(3, 4));    
list.Add(new Domino(5, 6));    
list.Add(new Domino(5, 6));    
list.Add(new Domino(1, 4));    
list.Add(new Domino(1, 6));    
List<Domino> chain = new List<Domino>();    
GetList(chain, list);
...