2016-03-27 14 views
0

Ich habe ein kleines Problem damit.Ich möchte jede mögliche Kombination generieren.Die Zahlen in 1D-Array befindet und es wird aus einer Datei gelesen. Jetzt weiß ich das Problem nicht: Ich weiß, dass jede Kombination, die zum Überwachen gedruckt wird, in aufsteigender Reihenfolge ist. Das Problem ist, dass wenn es mit der kleinsten Nummer endet, es nicht zur nächsten Nummer aufsteigt.Backtracking-Algorithmus zum Generieren aller Kombinationen

Beispiel: Die 1D-Array-Datei mit 1,2,3,4,5 und n = 5 und p = 3; Mögliche Kombinationen:

1 2 3, 1 2 4, 2 5 1 , 1 3 4, 3 5 1 , , 2 3 5, usw. ..

Hier ist, was ich bisher getan:

#include <stdio.h> 
#include <stdlib.h> 

void print(int*,int); 
void combination(int*,int,int,int); 
int main() 
{ 
    FILE *fin = fopen("bemenet.txt","r"); 
    if(!fin){printf("Error opening file @!!!");return 0;} 
    int *a,i,n,p = 3; 
    fscanf(fin,"%i ",&n); 
    a = (int*)malloc(n*sizeof(int)); 
    for(i = 0; i < n; ++i){ 
     fscanf(fin,"%i ",&a[i]); 
    } 
    combination(a,n,p,0); 

    return 0; 
} 

void combination(int *a,int n,int p,int k) 
{ 
    int i; 
    if(k == p){ 
     print(a,k); 
    } 
    else{ 
     for(a[k + 1] = a[k] + 1 ; a[k+1] < n; ++a[k+1]){ 
      combination(a,n,p,k+1); 
     } 
    } 
} 
void print(int *a,int k) 
{ 
    int i; 
    for(i = 0; i < k; ++i){ 
     printf("%i ",a[i]); 
    } 
    printf("\n"); 
} 

Antwort

0

der Grund, warum die Zahl ist, ist nur erhöht wird, dass man sie nie verringern. Auch die Bedingung a[k+1] < n macht für mich keinen Sinn, warum würden Sie eine Größe des Feldes mit dem Element des Arrays vergleichen (das kann 1000 sein)? Auch sollten Sie die Elemente im Array nicht als ++a[k+1] ändern, da es keinen Grund dafür gibt.

Siehe zum Beispiel Algorithm to generate all possible permutations of a list? für weitere Hilfe.

+0

aber wenn ich ex: for (i = 0; i Zsombi

Verwandte Themen