Path: utzoo!utgpu!watmath!watdragon!gwchem!leung From: leung@gwchem.waterloo.edu (K.W. Leung) Newsgroups: comp.lang.c Subject: Permutations Message-ID: <16440@watdragon.waterloo.edu> Date: 16 Sep 89 00:59:42 GMT Sender: daemon@watdragon.waterloo.edu Reply-To: leung@gwchem.waterloo.edu (K.W. Leung) Distribution: world Organization: U. of Waterloo, Ontario Lines: 87 I have seen sombody post a question on finding permutations of numbers I've found this particular algorithm in an issue of 1964 communication of ACM. This is just an direct translation of that alg. to C. I'm working on another version. I only run the following test and it seems that it is working quite nicely. Permutation is actually a hard problem. For people we are interested in more elegant alogrithm, I know that there is a recent doctoral dissertation at University of Victoria, BC, Canada. which contain on elegant alg. on permutation. ===============================CUTABOUTHERE============================== #include void prmut(); void permutation(); int xx[10], kk[10]; main() { int j; xx[1] = 1; xx[2] = 2; xx[3] = 3; kk[1] = 2; kk[2] = 2; kk[3] = 2; j = 3; prmut(j); } /* end - main */ void prmut(pp) int pp; { int x, j, n, m, i, b[10]; j = pp; if ( j==1 ) { x = xx[1]; m = 0; goto label1; } x = xx[j-1]; m = kk[j-1]; label1: for ( i=1; i <= kk[j]; i++ ) b[i] = xx[j]; permutation(x,m,kk[j], j, b); } /* end - prmut */ void permutation(x,m,n,j,b) int x, m, n, j, b[10]; { int i, k, n1, n2, j1, a, jj[10], yy[100]; n2 = n + m; if ( m == 0 ) goto label1; for ( i=n+1; i <= n2; i++ ) yy[i] = x; label1: for ( i=1; i <= n; i++ ) jj[i] = i; jj[n+1] = n2+1; j1 = j-1; k = n; label2: for ( i=1; i <= k; i++ ) yy[jj[i]] = b[i]; if ( j1 <= 1 ) { printf("list %d %d %d %d %d %d\n",yy[1],yy[2],yy[3],yy[4],yy[5],yy[6]); goto label3; } a = xx[j1-1]; n1 = kk[j1-1]; permutation(a,n1,n2,j1,yy); label3: for ( i=1; i <= n; i++ ) { yy[jj[i]] = x; jj[i] = jj[i] + 1; if ( (jj[i] - jj[i+1] + 1) <= 0 ) goto label4; else goto label5; label4: k = i; goto label2; label5: jj[i] = i; } } /* end - permutation */