代码如下:
/* ------------------------------------------------------ */
/* PROGRAM permutation by rotation : */
/* Give an integer n, this program generates all */
/* possible permutations by using rotation operations. */
/* */
/* Copyright Ching-Kuang Shene July/08/1989 */
/* ------------------------------------------------------ */
#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#define MAXSIZE 20
#define ROTATE(p) { int i, temp; \
temp = perm[p]; \
for (i = p-1; i >= 0; i--) \
perm[i+1] = perm[i]; \
perm[0] = temp; \
}
void main(void)
{
int perm[MAXSIZE];
int position;
int n;
int i;
char line[100];
printf("\nPermutation by Rotation Method");
printf("\n==============================");
printf("\n\nNumber of Elements --> ");
gets(line);
n = atoi(line);
for (i = 0; i < n; i++) /* initialize to 1,2,...,n */
perm[i] = i + 1;
position = n - 1;
while (position != 0) { /* if still have positions..*/
printf("\n"); /* display result */
for (i = 0; i < n; i++)
printf("%d ", perm[i]);
position = n - 1; /* starts from the last pos */
ROTATE(position); /* rotate them. */
while ((perm[position] == position + 1) && position != 0) {
position--; /* if last pos are equal and*/
ROTATE(position); /* not zero, rotate again*/
}
}
system("pause");
}
算法思想就是循环移位的嵌套遍历。首先旋转最外层,完成一次后然后旋转内层一次,然后再旋转外层,再查看内层,依次循环直到第一位。