n个数组成的数组A[n]进行全排列
例如:n = 3;A[n] = {1,2,3};
全排列后输出的结果为:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
算法实现:回溯
第一种方法:
#include<stdio.h>
//打印函数
void print(int A[] , int n){
for(int i = 0 ; i < n ; i++){
printf("%d " , A[i]);
}
printf("\n");
}
//交换函数
void swap(int A[] , int i , int j){
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
//全排列 从第p个到第q个进行全排列
void perm(int A[] , int p , int q){
if(p == q){
print(A , q+1);
}
else{
for(int i = p ; i <= q ; i++){
swap(A , p , i);
perm(A , p+1 , q);
swap(A , p , i);
}
}
}
int main()
{
int A[]={1,2,3};
int n = 3;
perm(A , 0 , 2);
return 0;
}
第二种方法:
#include<stdio.h>
int n , a[10] , mark[10] = {0};
void dfs(int step){
if(step > n){
for(int i = 1 ; i <= n ; i++){
printf("%d" , a[i]);
if(i != n) printf(" ");
else printf("\n");
}
}
else{
for(int i = 1 ; i <= n ; i++){
if(mark[i] == 0){
mark[i] = 1;
a[step] = i;
dfs(step+1);
mark[i] = 0;
}
}
}
}
int main()
{
n = 3;
dfs(1);
return 0;
}