思路很简单,递归加回溯,看代码很好懂,结果如下
#include <iostream>
#include <vector>
using namespace std;
int n;
vector<vector<int>> ans;
void find(vector<int> &a,vector<int> &used,vector<int> &t){
if(t.size() == n){
ans.push_back(t);
return;
}
for(int i=0;i<n;i++){
if(used[i] == 0){
t.push_back(a[i]);
used[i]=1; //使用过的置为1
find(a,used,t);
t.pop_back();//回溯,弹出元素
used[i]=0; //回溯,used置0
}
}
}
int main()
{
cout<<"请输入数字个数:";
cin>>n;
vector<int> a(n,0),t;
vector<int> used(n,0);
cout<<"请输入"<<n<<"个数字:";
for(int i=0;i<n;i++)
cin>>a[i];
find(a,used,t);
cout<<"\n结果如下:"<<endl;
for(int i=0;i<ans.size();i++){
for(int j=0;j<ans[i].size();j++)
cout<<ans[i][j]<<" ";
cout<<endl;
}
return 0;
}
其实,使用STL标准库函数next_permutation也可以很方便得到全排列,代码如下,具体参考博客http://blog.csdn.net/ac_gibson/article/details/45308645
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int num[3]={1,2,3};
do
{
cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl;
}while(next_permutation(num,num+3));
return 0;
}