1. 程式人生 > >【 OJ 】 HDOJ1027 18年11月12日20:16 [ 26 ]

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

因為本題的題意為,給定一串序列,指定輸出第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;
}