【 OJ 】 HDOJ1027 18年11月12日20:16 [ 26 ]

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QingCoffe/article/details/83998012

因为本题的题意为,给定一串序列,指定输出第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;
}

猜你喜欢

转载自blog.csdn.net/QingCoffe/article/details/83998012