遞歸實現全排列

遞歸實現全排列

問題

把 1~n這n個整數排成一行後隨機打亂順序,輸出全部可能的次序。spa

輸入格式

一個整數n。code

輸出格式

按照從小到大的順序輸出全部方案,每行1個。blog

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

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

數據範圍

1≤n≤9io

輸入樣例:

3

輸出樣例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

遞歸圖示

5`96NFX[LAC(JD9FQ)(8]L2.png

代碼(時間複雜度(O(n*n!))

#include <cstdio>

const int N = 10;

int state[N];    // 0:表示沒放數,1~n:表示放了哪一個數
bool used[N];    //true:表示用過,flase:表示未使用
int n;
 
void dfs(int u)
{
    if (u == n + 1)
    {
        for (int i = 1; i <= n; i ++)
            printf("%d ", state[i]);
        printf("\n");
        return;
    }
    
    for (int i = 1; i <= n; i ++)
    {
        if (!used[i])
        {
            state[u] = i;
            used[i] = true;
            dfs( u + 1);
            //恢復現場
            state[u] = 0;    //能夠去掉 
            used[i] = false;
        }
    }
}

int main()
{    
    scanf("%d", &n);
     dfs(1);
     
    return 0;
}
相關文章
相關標籤/搜索