Конкретные комбинации в C #, не в состоянии понять это - PullRequest
2 голосов
/ 02 октября 2011

В последнее время я искал комбинации, пробовал разные сторонние решения и сам пытался обдумать это.Без успеха я могу добавить.

Мне нужно сгенерировать строку длиной 13 со всеми возможными комбинациями, скажем .. int 0-2, IE

0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 0 2
0 0 0 0 0 0 0 0 0 0 0 1 0
... 
2 2 2 2 2 2 2 2 2 2 2 2 2

Вы, вероятно, получите упражнение, яЯ знаю, что я мог бы просто обернуть это в петли, если бы я хотел грязное решение.Любые указания или указатели приветствуются.

Ответы [ 3 ]

4 голосов
/ 02 октября 2011

Я был бы рад написать для вас код, но, похоже, вы ищете интуицию в этой проблеме. Так что, возможно, это больше похоже на момент "научить человека ловить рыбу".

Итак, позвольте мне задать вам несколько вопросов:

Давайте обобщим задачу на строки длины N. Как выглядит случай N = 1? Это

0
1
2

А как выглядит случай N = 2? Это

00
01
02
10
11
12
20
21
22

Интересно, видите ли вы, как, учитывая случай N = 1, мы можем легко вывести (то есть сформировать) случай N = 2 очень механическим способом. Теперь, если вы видите шаблон для этого конкретного случая, можете ли вы сказать, что шаблон для общего случая? Т.е. если у вас уже был в руках ответ для строк длины N, и я попросил вас предоставить мне ответ для строк длины N + 1, не могли бы вы сделать это? Если это так, у вас есть само определение рекурсивного алгоритма.

PS Думаю, я бы назвал эти комбинации, а не перестановки.

0 голосов
/ 02 октября 2011

Я быстро написал функцию, которая возвращает список перестановок, поэтому, если у вас нет времени написать собственный метод, вы можете использовать его. длина - длина перестановки, max - максимальное число (в вашем случае это будет 2)

    static List<int[]> getPermutationList(int length, int max)
    {
        List<int[]> perm_list = new List<int[]>();
        int[] perm = new int[length];
        for (int i = 0; i < length; ++i)
            perm[i] = 0;
        while(true)
        {
            for (int i = length - 1; ; --i)
            {
                if (i == -1)
                    return perm_list;
                if (perm[i] < max)
                {
                    perm[i]++;
                    for (int j = i + 1; j < length; ++j)
                        perm[j] = 0;
                    break;
                }

            }
            int[] perm_copy = new int[length];


            for (int i = 0; i < length; ++i)
            {
                perm_copy[i] = perm[i];
            }
            perm_list.Add(perm_copy);
        }
        return perm_list;
    }
0 голосов
/ 02 октября 2011

Я не могу не думать об этом, как о просто добавлении числа в числовой системе, основанной на N (в вашем примере это система с 3 основами).

Я бы написал один метод (если его еще нет в фреймворке или библиотеке), который позволял бы вам переключать базы. То есть:

String transformNumberFrom10BaseToXBase(int number, int base)

, затем просто напишите цикл for (извините, псевдо-c-like-code :)):

for (int i = 0; i < base ^ 13; i++) {
    print transformNumberFrom10BaseToXBase(i, base)
}

Хорошо, надеюсь, это поможет или даст вам представление о том, как ее решить:)

...