一般思路是由组合算排列,现在借助Next_permutation函数由排列到组合。
1.组合
读入一个字符串,一个整数n,输出字符串中取n个字符的所有组合情况
算法:借助Next_permutation函数,构造一个大小为len=str.length()的数组,0表示要输出的数,1表示不要输出的数。
代码如下:
#include <iostream>
#include <string>
#include <algorithm>
#include <memory.h>
using namespace std;
int main()
{
string str;
int n;
cin>>str>>n;
int len=str.length();
int a[100];
memset(a,1,sizeof(a));
for(int i=0;i<n;i++)
a[i]=0;
do
{
for(int i=0;i<len;i++)
{
if(a[i]==0)
cout<<str[i];
}
cout<<endl;
}while(next_permutation(a,a+len));
system("pause");
return 0;
}
2.排列
#include <iostream>
#include <string>
#include <algorithm>
#include <memory.h>
using namespace std;
int main()
{
string str;
int n;
cin>>str>>n;
int len=str.length();
int a[100];
char b[100];
memset(a,1,sizeof(a));
for(int i=0;i<n;i++)
a[i]=0;
do
{
int j=0;
for(int i=0;i<len;i++)
{
if(a[i]==0)
{
b[j]=str[i];
j++;
}
}
do
{
for(int i=0;i<j;i++)
cout<<b[i];
cout<<endl;
}while(next_permutation(b,b+j));
cout<<endl;
}while(next_permutation(a,a+len));
system("pause");
return 0;
}
排列回溯:
#include <iostream>
using namespace std;
const int n=4;//总的元素数
const int m=3;//需要排列的元素个数
int num[m];//记录状态的数组,保存各个位置的排列元素
bool is_valid(int count) //判断第count次取数是否合理
{
for(int i=0;i<count;++i)
{
if(num[i]==num[count])
{
return false;
}
}
return true;
}
void choose_num(int count) //第count次选数
{
if(count==m)//选取的排列元素够了
{
for(int i=0; i<m; ++i)
{
cout<<num[i];
}
cout<<endl;
return;
}
for(int i=1;i<=n;++i)//如果没选够,选择一个数,合理后递归调用
{
num[count]=i;
if(is_valid(count))
{
choose_num(count+1);
}
}
}
int main()
{
choose_num(0);
}