对于含有重复元素序列的全排列,为了再次排列后得到的序列中各不重复,需要用到c++中的do{}while(next_permutation(a,a+n))函数
对于判断每次排序后的序列是否符合条件,用到了构造方法,见代码
bool pan(int x,int y){
bool sheng=false;
bool jiang=false;
for(int i=x+1;i<=y;i++){
if(a[i]>a[i-1]) sheng=true;
else if(a[i]<a[i-1]) jiang=true;
}
if(sheng&&jiang) return false;
else if((sheng&&!jiang)||(!sheng&&jiang)||(!sheng&&!jiang)) return true;
}
先假设序列既不上升又不下降,满足一个或多个含一种数字的序列(符合条件),如果序列中没有下降子序列,或者序列中没有上升子序列(符合条件)
完整代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int ans=0;
int a[10]={2, 3, 3, 3, 5, 6, 6, 7, 7, 8};
bool pan(int x,int y){
bool sheng=false;
bool jiang=false;
for(int i=x+1;i<=y;i++){
if(a[i]>a[i-1]) sheng=true;
else if(a[i]<a[i-1]) jiang=true;
}
if(sheng&&jiang) return false;
else if((sheng&&!jiang)||(!sheng&&jiang)||(!sheng&&!jiang)) return true;
}
bool check(){
for(int i=0;i<8;i++){
for(int j=i+1;j<9;j++){
if(pan(0,i)&&pan(i+1,j)&&pan(j+1,9)){
return true;
}
}
}
return false;
}
int main(){
do{
if(check()) ans++;
}while(next_permutation(a,a+10));
cout<<ans;
}
全排列递归
#include<bits/stdc++.h>
using namespace std;
#define ll long long
void swap(int a[],int i,int j){
int temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
void printa(int a[],int n){
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
}
void qpl(int a[],int p,int q){
if(q==p){
printa(a,q+1);
cout<<endl;
}
for(int i=p;i<=q;i++){
swap(a,p,i);
qpl(a,p+1,q);
swap(a,p,i);
}
}
int main(){
int a[3]={1,2,3};
qpl(a,0,2);
}