/* Algorithm 4.11: Procedure Next for permutations in lexicographic order. */ #include #include #define MAX 12 int A[MAX]; int n; enum BOOLEAN {FALSE, TRUE}; enum BOOLEAN done; void PrintIt() { int i; for (i=1; i <= n ; i ++) printf(" %d", A[i]); printf("\n"); } void Next(void) { int k, j, r, s, tmp; k = n-1; while (A[k] > A[k+1]) k --; if (k == 0) done = TRUE; else { j = n; while (A[k] > A[j]) j --; tmp = A[j]; A[j] = A[k]; A[k] = tmp; r = n, s = k+1; while (r > s) { tmp = A[r]; A[r] = A[s]; A[s] = tmp; r--, s++; } } } int main(int argc, char* argv []) { int i; if (argc != 2) { printf("\n A single arguments expected.\n"); return 1; } n = atoi(argv[1]); if (n < 0) { printf("\n Positive number expected.\n"); return 2; } if (n > MAX) { printf("\n The argument cannot be not greater than %d.\n", MAX); return 3; } done = FALSE; for (i=0; i <= n; i ++) A[i] = i; /* Main loop */ do { PrintIt(); Next(); } while (!done); return 0; }