旋转法列出所有排列

xiaoxiao2021-02-28  79

代码如下: /* ------------------------------------------------------ */ /* 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"); } 算法思想就是循环移位的嵌套遍历。首先旋转最外层,完成一次后然后旋转内层一次,然后再旋转外层,再查看内层,依次循环直到第一位。
转载请注明原文地址: https://www.6miu.com/read-52338.html

最新回复(0)