全排列的代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int cmp(int a,int b)
{
return a>b;
}
bool isdecrese(const string&a)
{
for(auto i=0;i<a.length()-1;++i)
if(a[i]<a[i+1])
return false;
return true;
}
void SWAP(char &a,char &b)
{
char c;
c=a;
a=b;
b=c;
}
string next(string&a)
{
//cout<<"##"<<endl;
for(auto i=0;i<a.length()-1;++i)
{
if(a[i]<a[i+1]&&isdecrese(a.substr(i+1)))
{
char min=a[i+1];
auto index=i+1;
for(auto m=i+2;m<a.length();++m)
{
if(a[m]<min&&a[m]>a[i])
{
min=a[m];
index=m;
}
}
SWAP(a[i], a[index]);
sort(a.begin()+i+1,a.end());
return a;
}
}
return a;
}
int main()
{
string a,b;
cin>>a;
b=a;
sort(a.begin(),a.end());
sort(b.begin(),b.end(),cmp);
//cout<<isdecrese("12");
do{
cout<<next(a)<<endl;
}while(a!=b);
}
心得:
(1)如果用substr()函数,指含有一个参数的时候默认到末尾;
(2)do-while()循环的时候当满足括号里面的会继续循环;
(3)sort函数的运用(如何从大到小排列)。