参考http://www.cppblog.com/menjitianya/archive/2015/10/09/211980.html
http://blog.csdn.net/lsjseu/article/details/8878117
数组中n个数的全排列可以用深度优先搜索去做
全排列的种数是N!,要求按照字典序输出。这是最典型的深搜问题。我们可以把N个数两两建立无向边(即任意两个结点之间都有边,也就是一个N个结点的完全图),然后对每个点作为起点,分别做一次深度优先遍历,当所有点都已经标记时输出当前的遍历路径,就是其中一个排列,这里需要注意,回溯的时候需要将原先标记的点的标记取消,否则只能输出一个排列。如果要按照字典序,则需要在遍历的时候保证每次遍历都是按照结点从小到大的方式进行遍历的。
#include<iostream>
#include<vector>
using namespace std;
#define MAX 20
vector<int>index;
int visited[MAX]={0};
void dfs(int arr[],int len,int num,int k)//len代表数组长度,num表示当前求到第几个,k表示多少数的全排列
{
if(k==num){
for(int i=0;i<num;i++){
cout<<arr[index[i]]<<" ";
}
cout<<endl;
return;
}
for(int i=0;i<len;i++){
if(visited[i]==0){
index.push_back(i);
visited[i] = 1;
num++;
dfs(arr,len,num,k);
index.pop_back();
num--;
visited[i]=0;
}
}
}
int main()
{
int arr[]={1,2,3,4};
dfs(arr,4,0,3);//求3个数的全排列
system("pause");
return 0;
}