2017-02-22 48 views
0

Это пример ввод-вывод моего исходного кода генерации перестановки алфавиты строкиКак я могу изменить строку позиции листа путем рекурсивной перестановки в C?

Input: 
1 
3 8 
Output: 
Case 1: 
ABC 
ACB 
BAC 
BCA 
CBA 
CAB 

Мне нужно получить CAB в строке 5 и CBA в строке 6 этого выход, но я не знаю, как это сделать Это.

Вот то, что я до сих пор:

#include <stdio.h> 
int N, M, count; 
char array[27]; 

void swap (char array[], int i, int j) { 
    char t; 
    t = array[i]; 
    array[i] = array[j]; 
    array[j] = t; 
} 

void perm (char array[], int n, int i) { 
    if(count == M)return; 
    int j; 
    if (i == n) { 
     for (j=0; j<n; j++) printf ("%c", array[j]); 
      count++; 
     printf ("\n"); 
     return; 
} else 
    for (j=i; j<n; j++) { 

     swap (array, i, j); 
     perm (array, n, i+1); 
     swap (array, i, j); 
    } 
} 

int main() { 
int v[27], i, testCase, T; 
int tmp; 
char tmpC; 
scanf("%d", &T); 
for(testCase = 1; testCase <= T; testCase++){ 
    scanf("%d %d", &N, &M); 
    for (i=0; i<N; i++){ 
     v[i] = i+1; 
     tmp = i+65; 
     tmpC = tmp; 
     array[i] = tmpC; 
    } 
    printf("Case %d:\n", testCase); 
    count = 0; 
    perm (array, N, 0); 
} 
return 0; 
} 
+0

Thanks @Black Moses для исправления формата. :) –

+0

@Weaher Vane ... Хорошо, я согласен с вами. Но если я использую функцию swap, есть ли способ получить ожидаемый результат? –

ответ

0

Вот обновленный код для получения ожидаемого результата.

#include<stdio.h> 
#include<iostream> 
using namespace std; 

int N, A[27], used[27], M; 
string temp; 
int counter; 
void print() 
{ 
int i; 
for (i = 0; i < N; i++) 
    printf("%c", temp[i]); 
printf("\n"); 
} 

void solve(int i, int used[], string str) 
{ 
if (counter == M) return; 

if (i == N) { 
    print(); 
    counter++; 
    return; 
} 

for (int k = 0; k < N; k++){ 
    if (!used[k]){ 
     temp = str; 
     temp += (char)(k + 'A'); 
     used[k] = 1; 
     solve(i + 1, used, temp); 
     used[k] = 0; 
    } 
} 
} 

int main() 
{ 
int T; 
scanf("%d", &T); 
for (int testCase = 1; testCase <= T; testCase++){ 
    scanf("%d %d", &N, &M); 
    for (int i = 0; i < N; i++) 
     used[i] = 0; 
    counter = 0; 
    printf("Case %d:\n", testCase); 
    solve(0, used, ""); 
} 

return 0; 
} 
0

Ваша функция подкачки не будет делать эту работу. Алгоритм, который вы хотите, выглядит таким, который предпочитает элементы в соответствии с их первоначальным порядком, так что он будет всегда выберите A over B over C, используя первый доступный. Алгоритм подкачки предпочитает наименьшее изменение из предыдущей перестановки.

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

+0

Спасибо @Prune ...! Я решил свою проблему, изменив свой алгоритм и не используя функцию swap. –

+0

Отлично! Не забудьте проголосовать за полезные вещи, а затем выберите ответ (или напишите сами), чтобы переполнение стека могло должным образом удалить вопрос. – Prune

 Смежные вопросы

  • Нет связанных вопросов^_^