1
已解决
王梓轩
资深光能
资深光能
我们常常用DFS来做全排列,却未曾想到,没有简单一点的方法吗...
有个函数叫next_permutation(),还有个叫prev_permutation(),前者求上一个排列,后者求下一个排列
他们都是bool 类型,自然放到熟悉的while()里面
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
全排列(数组)
#include<iostream>
using namespace std;
#include<algorithm> //为了使用 next_permutation() 函数
int main()
{
int a[4]={0,1,2,3};
while(next_permutation(a+1,a+4)) //全排列函数,对数组中下标为 1 ~ 3 的元素进行全排列
{
for(int i=1;i<=3;i++)
cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
全排列(字符串)
#include<iostream>
using namespace std;
#include<algorithm> //为了使用 prev_permutation() 函数
int main()
{
string s="abc";
while( prev_permutation( s.begin(),s.end() ) )
{
cout<<s<<endl;
}
return 0;
}
->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->->
字符串按内部排序,数组一样(否则你自己试试)
但可能还有人会问:那组合岂不是不行
俗话说的好:《组合数学碰运气》
这就让我想到了
更简单
就这样:
#include<bits/stdc++.h>
using namespace std;
const int s=1e+006;
int a[s]={0},n,r;
int main()
{
cin>>n>>r;
for(int i=1;i<=r;i++)
a[i]=1;
do
{
for(int i=1;i<=n;i++)if(a[i]!=0)cout<<i<<" ";
cout<<endl;
}while(prev_permutation(a+1,a+n+1));
}
但万一有重复元素呢?
不关你事,放心就好。