2016-03-27 9 views
0

私はこの問題に少し問題があります。可能なすべての組み合わせを生成したいと思います。数字は1D配列にあり、ファイルから読み込まれます。今私は問題を知らない:私は、監視するために印刷されるすべての組み合わせが昇順であることを知っている。問題は、最小の数字で終了すると次の数字に上がらないということです。すべての組み合わせを生成するバックトラッキングアルゴリズム

例:1,2,3,4,5およびn = 5およびp = 3の1D配列ファイル。 可能な組合せ:

1 2 3、 1 2 4、 1 2 5、 1 3 4、 1 3 5、 1 4 5、 2 3 4、 2 3 5、 等...ここで

は、私がこれまで行って何です:

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

答えて

0

数のみが増加している理由は、あなたがそれらをデクリメントないこと、です。また、条件a[k+1] < nはわかりません。フィールドのサイズを配列の要素(1000など)と比較するのはなぜですか?また、配列内の要素を++a[k+1]として変更する必要はありません。

たとえば、 Algorithm to generate all possible permutations of a list? を参照してください。

+0

私はex:for(i = 0; i Zsombi

関連する問題