[Shootout-list] fannkuch.c

Falk Hueffner falk@debian.org
Mon, 14 Mar 2005 20:13:57 +0100


--=-=-=

Hi,

apparently it got lost last time; here's a C version of fannkuch.

-- 
	Falk

--=-=-=
Content-Type: text/x-csrc
Content-Disposition: inline; filename=fannkuch.c

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static inline void swap(int *i, int *j) {
    int tmp = *i;
    *i = *j;
    *j = tmp;
}

static inline void reverse(int *first, int *last) {
    while (first < last)
        swap(first++, --last);
}

static bool next_permutation(int *first, int *last) {
    int *i = last - 1;
    while (true) {
        int *ii = i;
        i--;
        if (*i < *ii) {
            int *j = last;
            while (*i >= *--j)
                ;
            swap(i, j);
            reverse(ii, last);
            return true;
        }
        if (i == first) {
            reverse(first, last);
            return false;
        }
    }
}

static int count_reversals(const int *pin, int n) {
    int p[n];
    int count = 0;
    memcpy(p, pin, sizeof p);
    while (p[0] != 1) {
	reverse(p, p + p[0]);
	count++;
    }
    return count;    
}

int main(int argc, char *argv[]) {
    int n = atoi(argv[1]);
    int p[n], i;
    for (i = 0; i < n; i++)
	p[i] = i + 1;

    int max_count = 0;
    do {
	int count = count_reversals(p, n);
	if (count > max_count)
	    max_count = count;
    } while (next_permutation(p, p + n));
    printf("%d\n", max_count);

    return 0;
}

--=-=-=--