給定n個不同的數,要求生成這n個數的全排列!
解法1:遞迴思想,首先選定第乙個數(有n種不同的選擇方式),然後對剩下的n-1個數進行全排列;根據此步驟,對剩下n-1數的全排列進行遞迴。
void permutation(vector& ivec, int level)
for(int i = level; i < ivec.size(); ++i)
}
解法2:列舉思想,想象有n個位置,每乙個位置可放置乙個數。對每乙個位置列舉各個數字。
void permutation(vector& ivec, vectorper,
vector& ok, int level)
for(int i = 0; i < ivec.size(); ++i) }
}
int find(vector& ivec, int i)
int bsearch(vector& ivec, int beg, int val)
// stop when ivec[low] <= val or ivec[high] > val
return high;
}void permutation(vector& ivec)
;}
完整**+測試:
#include using namespace std;
class incr ;
int operator()() ;
private:
int beg;
};void permutation(vector& ivec, int level)
for(int i = level; i < ivec.size(); ++i) }
void permutation(vector& ivec, vectorper,
vector& ok, int level)
for(int i = 0; i < ivec.size(); ++i) }
}int find(vector& ivec, int i)
int bsearch(vector& ivec, int beg, int val)
// stop when ivec[low] <= val or ivec[high] > val
return high;
}void permutation(vector& ivec);}
void work()
int main()
全排列的三種實現
題目描述 生成由1至n個數的全排列。輸入 輸入包含多組樣例,每組樣例輸入乙個整數n 1 n 9 輸出 按照字典序反序輸出,每個數值之間用空格隔開。每個排列單獨佔一行。逆字典序 include include include int num 10 int visited 10 int n,t void...
總結 三種全排列演算法
1 遞迴演算法 演算法書上有詳細的解釋,複製如下 設r 是要進行排列的n個元素,ri r 集x中元素的全排列記為perm x ri perm x 表示在全排列perm x 的每乙個排列前加上字首ri得到的排列.r的全排列可歸納定義如下 當n 1時,perm r r是集合r中唯一的元素.當n 1時,p...
全排列的兩種寫法
對於陣列 1,2,3 他們按照從小到大的全排列是 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 現在給你乙個正整數n,n小於8,輸出陣列 1,2,n 的從小到大的全排列。由出口遞迴回溯時,至少返回2層,第一次因為if語句,第二次因為不滿足for迴圈條件 include in...