1. 程式人生 > 其它 >排列總方案數(全都要選)

排列總方案數(全都要選)

遞迴實現排列型列舉

把 1∼n 這 n 個整數排成一行後隨機打亂順序,輸出所有可能的次序。

輸入格式
一個整數 n。

輸出格式
按照從小到大的順序輸出所有方案,每行 1 個。

首先,同一行相鄰兩個數用一個空格隔開。

其次,對於兩個不同的行,對應下標的數一一比較,字典序較小的排在前面。

資料範圍
1≤n≤9
輸入樣例:
3
輸出樣例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

圖解

Code

點選檢視程式碼
#include<iostream> 
using namespace std;
int n;
bool st[20];		//是否選過
int ways[20];		//儲存方案

void dfs(int x){	//選到第x位
    if(x > n){		//選到第n+1位,即得到一種方案
        for(int i = 1; i <= n; i ++ ){		//輸出方案
            cout << ways[i] << " ";
        } 
        puts("");
    }

    for(int i = 1; i <= n; i ++ ){			//列舉每一位
        if(!st[i]){				//如果沒選過
            st[i] = 1;
            ways[x] = i;		//選i
            dfs(x + 1);			//選下一位
			ways[x] = 0;		//恢復現場
            st[i] = 0;
        }
    }
}

int main(){
    cin >> n;
    dfs(1);			//從第一位開始選
}