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 進行,都...