2 * The Computer Lannguage Shootout
3 * http://shootout.alioth.debian.org/
4 * Contributed by Heiner Marxen
33 perm = calloc(n, sizeof(*perm ));
34 perm1 = calloc(n, sizeof(*perm1));
35 count = calloc(n, sizeof(*count));
37 for( i=0 ; i<n ; ++i ) perm1[i] = i; /* initial (trivial) permu */
39 r = n; didpr = 0; flipsMax = 0;
42 for( i=0 ; i<n ; ++i )
43 printf("%d", (int)(1+perm1[i]));
52 #define XCH(x,y) { Aint t_mp; t_mp=(x); (x)=(y); (y)=t_mp; }
54 if( ! (perm1[0]==0 || perm1[n1]==n1) ) {
56 for( i=1 ; i<n ; ++i ) { /* perm = perm1 */
59 k = perm1[0]; /* cache perm[0] in k */
60 do { /* k!=0 ==> k>0 */
62 for( i=1, j=k-1 ; i<j ; ++i, --j ) {
67 * Now exchange k (caching perm[0]) and perm[k]... with care!
68 * XCH(k, perm[k]) does NOT work!
70 j=perm[k]; perm[k]=k ; k=j;
73 if( flipsMax < flips ) {
82 /* rotate down perm[0..r] by one */
94 if( (count[r] -= 1) > 0 ) {
103 main( int argc, char* argv[] )
105 int n = (argc>1) ? atoi(argv[1]) : 10;
107 printf("Pfannkuchen(%d) = %ld\n", n, fannkuch(n));