2013-09-14 5 views
1

Приведенный ниже код печатает всю возможную комбинацию данной строки. Он создает строки рекурсивно. Теперь я хочу сохранить каждую комбинацию в массиве, используя массив указателей на каждую строку. Как инициализировать указатель так, чтобы он указывал на строку. Код: -Сохранение строк в массиве

Input ABC 
Output 

ABC in b[0] 
ACB in b[1] 
BAC 
BCA 
CAB 
CBA 

и так далее.

спасибо :)

void permute(char *a, int i, int n) 
{ 
    int k=0; 
    char *b[100]; 
    int j; 
    if (i == n) 
    { 
     // *b[k]=a; 
    printf("%s\n", a); 
     i++; 
    } 
    else 
    { 
     for (j = i; j <= n; j++) 
     { 
      swap((a+i), (a+j)); 
      permute(a, i+1, n); 
      swap((a+i), (a+j)); //backtrack 
     } 
    } 
} 
+0

Вы знаете, сколько комбинаций впереди? Вы хотите, чтобы массив был предварительно выделен или вы хотите, чтобы он был динамически распределен? Ты знаешь разницу? – AlexLordThorsen

+0

Да будет n! комбинация строки. – user2456752

ответ

0

Там нет смысла указывать элементы b к a, так как это a переменная строка (то есть, она постоянно меняется). Возможным выходом такого кода будет то, что все элементы b будут последней перестановкой строки a.

Вам нужно динамическое распределение строки каждый раз, когда вы найдете новую перестановку. Что вы можете сделать вручную, используя malloc(). Или можете использовать strdup() для создания повторяющихся строк для вас (запомните free() их в конце курса).

/*Sample Code*/ 

if (i == n) 
{ 
    b[k] = strdup(a); 
    ... 
} 

Помните, что вы также должны пройти k в качестве аргумента функции permute(), поскольку k является автоматической переменной, вновь созданное со значением = 0, каждый раз, когда функция permute() называется. Существуют и другие возможности: kglobal или static переменная.

0

Вы можете динамически выделять массив, в котором будут храниться отдельные массивы символов (или строки C), представляющие каждую перестановку. Одна из вещей, которые сделают этот общий код, - найти значение total_permutations в main() для данной строки с strlen N, которая фактически была бы факториальной (N). Здесь:

void swap(char* A, char* B) { 
    char t; 
    t = *A; 
    *A = *B; 
    *B = t; 
} 

int permute(char **arr_of_chars, int count, char *a, int i, int n) 
{ 
    int k=0; 
    char *b[100]; 
    int j; 
    if (i == n) { 
     // *b[k]=a; 
     printf("%s\n", a); 
     memcpy(arr_of_chars[count], a, strlen(a)); 
     count++; 
     i++; 
    } else { 
     for (j = i; j <= n; j++) { 
     swap((a+i), (a+j)); 
     count = permute(arr_of_chars, count, a, i+1, n); 
     swap((a+i), (a+j)); //backtrack 
     } 
    } 
    return count; 
} 

int main() { 
    char str[] = ""; 
    char **arr_of_str = NULL; 
    int len_str = strlen(str); 
    int i = len_str; 
    int total_permutations = 1; 

    while (i > 0) { /* Get all the combinations */ 
     total_permutations *= i; 
     i--; 
    } 

    arr_of_str = (char **) malloc(total_permutations * sizeof(char*)); 
    for (i=0; i <total_permutations; i++) { 
     arr_of_str[i] = (char *) malloc(sizeof(char) * len_str); 
    } 

    permute(arr_of_str, 0, str, 0, (len_str-1)); 

    for (i=0; i <total_permutations; i++) { 
     printf("%s \n", arr_of_str[i]); 
     free(arr_of_str[i]); 
    } 
    free(arr_of_str); 
} 
Смежные вопросы