递归回溯 求N个数的全排列 及 next_permutation的使用

来源:互联网 发布:北京编程培训学校 编辑:程序博客网 时间:2024/06/06 06:54
思路很简单,递归加回溯,看代码很好懂,结果如下
#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;//使用过的置为1find(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;}



原创粉丝点击