Saturday, July 14, 2012

Permutations

Hey following is a method using backtracking to print all permutations of a number in C++.
// A program using backtracking to generate premutations of 1,n numbers .

#include <cstdio>

#define MAXCANDIDATES 20

void backtrack(int a[],int k,int n);

int is_a_solution(int k,int n);

void process_solution(int a[],int n);

void construct_candidates(int a[],int c[],int k,int n, int *ncandidates);

int main()
{
    int n;
    scanf("%d",&n);
    int a[n+1];
    for(int i=1;i<n;i++)a[i]=0;
    backtrack(a,0,n+1);
    return 0;
}

int is_a_solution(int k,int n)
{
return (k==(n-1));
}

void process_solution(int a[],int n)
{
     printf("{");
     for(int i=1;i<n;i++) printf("%d,",a[i]);
     printf("\b}\n");
}

void construct_candidates(int a[],int c[],int k,int n,int *ncandidates)
{  
     bool in_perm[n];
     for(int i=1;i<n;i++)in_perm[i]=false;
     for(int i=1;i<k;i++)in_perm[a[i]]=true;
   
     *ncandidates =0;
     for(int i=1;i<n;i++){
           if(!in_perm[i]){
                           c[(*ncandidates)++]=i;
           }
   
     }
}
void backtrack(int a[],int k,int n)
{
     int c[MAXCANDIDATES];
     int ncandidates;
   
     if(is_a_solution(k,n)){
             process_solution(a,n);
     }
     else {
          k=k+1;
          construct_candidates(a,c,k,n,&ncandidates);
          for(int i=0;i<ncandidates;i++){
             a[k]=c[i];
             backtrack(a,k,n);
             }
     }    
}

   
   
   
     

No comments:

Post a Comment