1. 程式人生 > >遞迴輸出全排列

遞迴輸出全排列

題目:輸出1-8的全排列。

思路:遞迴,已取數(放首位)+剩餘數(繼續全排列)。對於1-3的全排列進行分析:第一位放1,再對兩位2,3進行全排列。第一位放2,再對1,3全排列……

其它思路:STL中有next_permutation(首位置,末位置)函式,求固定區間內數的下一個全排列。實現原理(之前寫過部落格,可惜用到的時候想不起來,所以就當瞭解好了):對於1,2,3,5,4要尋找當前序列的下一個排列,從後向前尋找逆序列,即5,4,再對前一個數進行3操作,將3,4對換,變成1,2,4,5,3,再將逆序部分正序即可,即1,2,4,3,5。

詳細連結:http://blog.csdn.net/mungbeanwithredface/article/details/77995593

全排列和逆序數:突然想起一個知識點補充一下吧。對於一個排列,逆序數為奇數則為奇排列,為偶數則為偶排列。任意兩個位置對換,會改變排列的奇偶性。連結:https://wenku.baidu.com/view/50a4737e102de2bd97058826.html

ac程式碼1:

#include<bits/stdc++.h>
using namespace std;
int a[]={1,2,3,4,5,6,7,8};
void print(int s,int e){
	if(s==e){
		for(int i=0;i<e;i++)
			printf("%d%c",a[i],i==e-1?'\n':' ');
		return;
	}
	for(int i=s;i<e;i++){
		for(int j=i;j>=s+1;j--)
		swap(a[j],a[j-1]);
		print(s+1,e);
		for(int j=s;j<=i-1;j++)
		swap(a[j+1],a[j]);
	}
}
int main(){
	print(0,8);
	return 0;
}

ac程式碼2:

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int main(){
    int a[]={1,2,3,4,5,6,7,8};
    do{
        for(int i=0;i<7;i++){
            printf("%d ",a[i]);
        }
        printf("%d\n",a[7]);
    }while(next_permutation(a,a+8));
    return 0;
}