1. 程式人生 > >回溯之全排列

回溯之全排列

全排列

問題描述:

輸入一個數n,輸出從1~n的全排列

樣例輸入

3

樣例輸出

123 132
213 231
321 312

回溯法

完全沒有限制的排列,那便也用不到剪枝函式

程式碼

/*
全排列 
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>

using namespace std;

#define MAX_N 10

static int a[MAX_N];
static int flag1 =
0; static int flag2 = 0; static int nn; void print() { if(flag1 == 0) ; else cout <<" "; for(int i = 0;i < nn;i ++ ){ cout << a[i]; } } void dfs(int n) { if(n==1){ if(flag2!=0) cout << endl; flag1 = 0; flag2++; } if(n == nn){ print(); flag1++; return; } else
{ for(int i = n;i < nn;i ++ ){ swap(a[n],a[i]); dfs(n+1); swap(a[i],a[n]); } } return; } int main() { int n; while(cin >> nn,nn){ memset(a,0,MAX_N); for(int i = 0;i < nn;i ++ ){ a[i] = i+1; } dfs(0); cout << endl; flag2 = 0; } return 0; }