据说是用了DFS的思想……然鹅并不知道这是DFS。
主要就是选取一个数放到数组相应位置上,然后递归的排列剩下的数组,将剩下的数组递归排列完了之后再把数放回去,然后这一层递归就返回了……
有重复数的话遇到重复的不要重复放置就好了……
// // main.c // Full Permutation // // Created by 余南龙 on 2016/12/13. // Copyright © 2016年 余南龙. All rights reserved. // #include <stdio.h>void Swap(int *a, int *b){int tmp = *a;*a = *b;*b = tmp; }void Output(int A[], int size){int i;for(i = 0; i < size; i++){printf("%d ", A[i]);}putchar('\n'); }void Full_Permutation(int A[], int begin, int end, int p_size){int i;if(begin >= p_size){Output(A, p_size);}else{for(i = begin; i <= end; i++){Swap(A + begin, A + i);Full_Permutation(A, begin + 1, end, p_size);Swap(A + begin, A + i);}} }void Full_Permutation_Duplicate(int A[], int begin, int end, int p_size){int i, j;if(begin >= p_size){Output(A, p_size);}else{for(i = begin; i <= end; i++){for(j = begin; j < i; j++){if(A[j] == A[i]){break;}}if(i == j){Swap(A + begin, A + i);Full_Permutation_Duplicate(A, begin + 1, end, p_size);Swap(A + begin, A + i);}}} }int main() {int A[6] = {1, 2, 3, 4, 5, 6};int B[5] = {1, 1, 2, 2, 3};Full_Permutation(A, 0, 5, 3);Full_Permutation_Duplicate(B, 0, 4, 5); }