/* Permute a string,  but see the footnote! */

#define true  1
#define false 0

main()
 { int  used[4];
   char perm[4];
   int i, N;
   N = 4;

   for(i = 0; i < N; i++) used[i] = false; /* nothing is used, yet */

   permute("pops", 4, perm, 0, used);

 }/*main*/


permute(char A[], int N, char perm[], int level, int used[])
 { int i;
   if(level >= N) /* complete - print a permutation */
    { for(i = 0; i < N; i++)
         printf("%c", perm[i]);
      printf("\n");
    }
   else /* continue construction of the permutation */
    { for(i = 0; i < N; i++)
         if( ! used[i] )
          { used[i] = true; perm[level] = A[i];  /* reserve A[i] */
            permute(A, N, perm, level+1, used);  /* recursion    */
            used[i] = false;                     /* free A[i]    */
          }//if
    }
 }/*permute*/

/* This is NOT a very good program because it is limited
   to permuting just one string of length 4.
   Exercise: Generalise it to permute any string which it gets
             as a command-line parameter.
             See the directory  ../Basic/  for command-line parameters.
   L. Allison 31/1/2000
*/

