A fully-arranged generation algorithm, next_permutation_1 can be used to generate a full array of multiset, next_permutation_2 cannot be used for multiple sets
#include <cstdio>#include<cstring>#include<vector>using namespacestd;BOOLNext_permutation_1 (vector<int>&VEC) { intn = vec.size ()-1; for(;n>0; n--){ if(vec[n]>vec[n-1]){ Break; } } if(n==0)return 0; intt = vec.size ()-1; for(;t>0; t--){ if(vec[t]>vec[n-1]) Break; } Swap (Vec[t],vec[n-1]); for(t = vec.size ()-1; T>n;t--, n++) Swap (vec[n],vec[t]); return 1;} BOOLNext_permutation_2 (vector<int>& Vec, vector<int>&Direct) { intMX =-1, idx =-1, n =vec.size (); for(intI=0; i<n;i++){ if(i>0&&direct[i]&&vec[i-1]<VEC[I]&&VEC[I]>MX) idx = I,MX =Vec[i]; if(i<n-1&&!direct[i]&&vec[i]>vec[i+1]&&VEC[I]>MX) idx = i, mx =Vec[i]; } if(idx==-1)return 0; if(Direct[idx]) {Swap (Direct[idx-1],direct[idx]); Swap (Vec[idx-1],vec[idx]); } Else{swap (Direct[idx+1],direct[idx]); Swap (Vec[idx+1],vec[idx]); } for(inti =0; I<vec.size (); i++){ if(VEC[I]>MX) direct[i]^=1; } return 1;}intMain () {intN; scanf ("%d",&N); Vector<int>Vec,vec2,dir; for(intI=1; i<=n;i++) Vec.push_back (i); for(intI=1; i<=n;i++) Vec2.push_back (i), Dir.push_back (1); printf ("From next permutation 1\n"); Do{ for(intI=0; I<vec.size (); i++) {printf ("%d", Vec[i]); } printf ("\ n"); } while(next_permutation_1 (VEC)); printf ("From next permutation 2\n"); Do{ for(intI=0; I<vec2.size (); i++) {printf ("%d", Vec2[i]); } printf ("\ n"); } while(Next_permutation_2 (Vec2,dir));}
Full permutation generation algorithm