三种方法:递归和非递归,深搜也可以,毕竟也是一层层递归 回溯。
转自:http://blog.csdn.net/e3399/article/details/7543861
递归
#include <stdio.h>
int n = 0;
void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m)
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf("\n");
n++;
}
else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
int main()
{
int list[] = {1, 2, 3, 4, 5};
perm(list, 0, 4);
printf("total:%d\n", n);
return 0;
}
非递归:STL:
#include <iostream>
#include <algorithm>
using namespace std;
template <typename BidirectionalIterator>
void permutation(BidirectionalIterator array, int len)
{
sort(array, array + len);
do{
for(int i = 0; i < len; ++i){
cout<<array[i]<<" ";
}
cout<<endl;
}while(next_permutation(array, array + len));
}
int main(int argc, char **argv)
{
int a[4] = {1, 2, 3, 4};
permutation(a, sizeof(a) / sizeof(int));
return 0;
}
dfs:
#include <cstdio>
#include <cstring>
using namespace std;
int a[9];
int book[10];
void dfs(int cur)
{
if(cur==9)
{
for(int i=0;i<9;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return ;
}
for(int i=0;i<9;i++)
{
if(!book[i])
{
a[cur]=i;
book[i]=1;
dfs(cur+1);
book[i]=0;
}
}
}
int main()
{
dfs(0);
}