2016-03-27 21 views
0

Bununla ilgili küçük bir sorunum var. Mümkün olan her kombinasyonu üretmek istiyorum. 1D dizisinde bulunan numaralar ve bir dosyadan okunur. Şimdi problemi bilmiyorum: İzlemeye basılacak her kombinasyonun artan sırada olduğunu biliyorum. Probelm, eğer en küçük sayı ile bitirirse, bir sonraki sayıya yükselmez.Tüm kombinasyonları oluşturmak için Backtracking algoritması

Örnek: 1,2,3,4,5 ve n = 5 ve p = 3 olan 1D dizi dosyası; olası kombinasyonlar:

1 2 3, 1 2 4, 1 2 5, 1 ila 3 4, 1 3 5, 1 ila 4 5, 2 3 4, 2 3 5, vs. .. İşte

Bugüne kadar yapılan budur: sayı yalnızca onları azaltma asla, is artırma neden

#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"); 
} 

cevap

0

sebep. Ayrıca a[k+1] < n durumu benim için hiçbir anlam ifade etmiyor, neden alanın büyüklüğünü dizinin elemanıyla karşılaştırıyorsunuz (örneğin 1000 olabilir)? Ayrıca, dizideki öğeleri ++a[k+1] olarak değiştirmemelisiniz, çünkü bunun için bir neden yoktur. Daha fazla bilgi için örneğin Algorithm to generate all possible permutations of a list? adresine bakın.

+0

ama eğer eski kullanırsam: (i = 0; i Zsombi

İlgili konular