2017-02-22 4 views
0

これは、アルファベット文字列の順列を生成する私のソースコードのサンプル入力が出力されCで再帰的置換によってリーフ位置文字列を変更するにはどうすればよいですか?

Input: 
1 
3 8 
Output: 
Case 1: 
ABC 
ACB 
BAC 
BCA 
CBA 
CAB 
私は、この出力のライン6日にライン5日で CABCBAを取得する必要がありますが、私は方法がわからない

それ。

#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

@BlackMosesの形式を修正していただきありがとうございます。 :) –

+0

@Weaher Vane ... Ok、私はあなたに同意します。しかし、私はスワップ機能を使用していますが、私の期待される出力を得る方法はありますか? –

答えて

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

あなたのスワップ機能は仕事をしません。ここで

は、私がこれまで持っているものです。あなたが望むアルゴリズムは、元の順序に従って要素を好むものであるように見えるので、 常には、最初の1つを利用可能にして、Cよりも上のBを選択します。スワッピングアルゴリズムは、以前の順列から最小の変化を好む。

希望の出力を得るには、別のアルゴリズムに変更する必要があると思います.1つの要素を取るアルゴリズムです(順番に循環します)。各選択肢について、それはリストの残りの部分で繰り返される。

+0

ありがとう@Prune ...! 私はアルゴリズムを変更し、スワップ機能を使用しないで私の問題を解決しました。 –

+0

素晴らしい!スタックオーバーフローが適切に質問をリタイアできるように、有益なものをアップポイントしてから回答を選択する(または自分で書く)ことを忘れないでください。 – Prune

関連する問題