因为本题的题意为,给定一串序列,指定输出第M个全排序序列
所以本题网上解题的基本上都是用的STL的全排列算法next_permutation,简单粗暴可以直接AC
具体思想可以参考《STL源码剖析》
本来想直接使用next_permutation来直接AC这题,后来还是写了一下,和源码基本差不多.....ummm属于盗版吧
本题已经AC
# include<iostream>
using namespace std;
int a[1002];
void swap(int &a, int &b) {
int t;
t = a;
a = b;
b = t;
}
bool next_permutation_(int*a, int N) {
if (N < 2)
return false;
int i, ii, j;// i ii j 三个指针
i = N - 1;
for (;;) {
ii = i--;
if (i>=0&&a[i] < a[ii]) {
j = N;
while (a[--j] <= a[i]);//不需要加限制条件 ii 肯定大于
swap(a[i], a[j]);//交换 i j
reverse(a+ii,a+N);//ii 之后全部翻转
return true;
}
if(i<0)
return false;
}
}
int main(void) {
int N, M;// N个数 第M个全排列序列
while (cin >> N >> M) {
for (int i = 0; i < N; ++i) {
a[i] = i + 1;
}//录入数据
for (int i = 1; i < M; ++i) {
next_permutation_(a, N);
}
cout << a[0];
for (int i = 1; i < N; ++i) {
cout << " " << a[i];
}
cout << endl;
}
system("pause");
return 0;
}
下面有一个全排列的递归(非字典排序)感觉不错,看别人写的,自己写了一下保存防止忘记
此代码是在网页中写的,可能会有细节错误,但是应该没太大问题.....ummm没有用编译器检查
# include<iostream>
using namespace std;
int a[100];
void swap(int a,int b){
int t;
t=a;
a=b;
b=t;
}
void permutation(int*a,int N,int index){
if(index==N){
for(int i=0;i<N;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
for(int i=0;i<N;i++){
swap(a[i],a[index]);
permutation(a,N,index+1);
swap(a[i],a[index]);
}
}
int main(void){
int N;
cin>>N;
for(int i=0;i<N;++i){
a[i]=i+1;
}//录入数组
permutation(a,N,0);//递归中会输出所有全排列
system("pause");
return 0;
}