全排列演算法問題

2021-07-25 04:16:59 字數 1223 閱讀 9195

acm經典演算法題目

輸入n,輸出1~n的全排列

如輸入:3

輸出:

123

132……

如圖:

關於這個問題要如何實現呢:

大家可以自己先思考一下,下面我說一下答案。

這其實是一道簡單的深度優先搜尋的題目

**:

#include #include #include #include using namespace std;

#define max_n 1000

bool used[max_n];

int perm[max_n];

void permutation1(int pos, int n)

printf("\n");

return ;

}for(int i = 0; i < n; i++)

}return ;

}int main()

結果:

如果對**有問題的小夥伴我猜是對這一段**塊不理解

for(int i = 0; i < n; i++)

}

其實不難:設定乙個used陣列用來標記當前元素是否已經被訪問,如果沒有被訪問過則進入if**塊,將當前元素填入perm陣列中(perm陣列是用來記錄全排列元素的順序的)並將used陣列置為true,並遞迴呼叫此函式。那麼問題來了,為什麼要在後面加乙個把used陣列又重置為false呢?其實這就是dfs的回溯(相信有的小夥伴已經明白了)。比如:123下乙個排列是132,為什麼能產生132呢,就是因為當本次遞迴到出口後,又將used陣列重置為false才能夠繼續訪問2和3,先重置元素3,再重置元素2,這就是回溯。

那麼到這裡還沒有結束,因為c++標準庫為我們提供了一種更加便捷的方式(記得要加標頭檔案algorithm):

**:

#include #include #include #include using namespace std;

#define max_n 1000

int perm2[max_n];

void permutation2(int n)

dowhile(next_permutation(perm2, perm2+n));

return ;

}int main()

結果:

是不是感覺又輕鬆了不少呢!

演算法 全排列問題

求n個元素的全排列。eg 將這n個元素看做乙個陣列,我們用乙個數值k 從0開始 來代表某個元素的位置索引,那麼讓陣列中每乙個元素與k進行一次交換,然後將k加1繼續呼叫遞迴,最後回溯 將交換位置後的陣列還原 package suanfa k 當前的交換位置 讓k後面的每個元素與k交換 public c...

排列問題(全排列的遞迴演算法問題)

題目 設計乙個遞迴演算法生成n個元素的全排列。演算法講解 設r 是要進行排列的n個元素,ri r 集合x中元素的全排列記為perm x ri perm x 表示在全排列perm x 的每乙個排列前加上字首得到的排列。r的全排列可歸納定義如下 當n 1時,perm r r 其中r是集合r中唯一的元素 ...

演算法基礎 全排列問題

全排列是常見的一種場景,對於缺乏更好技巧的時候,作為暴力破解的思路,結合深度遍歷使用對初入門者非常有效,代價就是時間複雜度很高。這篇文章介紹一下使用臨位對換法來解決全排列的思路和方法。通常存在如下幾種方法解決此此類問題,本文示例主要使用臨位對換法進行模擬的實現。本系列基礎文章基本使用c c 進行,都...