问题描述:
给定正整数n(>=2),求从1~n的全排列。
求解:
这个问题与0/1背包以及幂集问题的增量枚举解法很类似,甚至还更简单。
利用增量枚举法,利用向量vector便于动态插入。
初始vector中只有{1},向{1}的两个位置插入2得到其中一个集合{1,2},再对这个集合的三个位置插入3得到其中一个集合{1,2,3},全部的情况可以画成一颗数。
代码:
这里的插入函数insert()有个很有意思的巧合,那就是需要插入的数字n,这是数字是多少,那么当前集合就有几个待插入的空位置,比如插入2,那么{1}就有两个插入位置,形成{1,2}和{2,1}。
#include#include #include using namespace std; void insert(vector s,int n,vector >&ps) {//n等于几,就有几个插入位置 vector t; vector ::iterator it; for (int i = 0; i < n; i++) { t = s; it = t.begin() + i; t.insert(it, n); ps.push_back(t); } } void dis(vector >ps) { vector >::iterator it; vector ::iterator in_it; for (it = ps.begin(); it != ps.end(); it++) { for (in_it = (*it).begin(); in_it != (*it).end(); in_it++) { cout << *in_it << " "; } cout << endl; } } void full_perm(vector >& all, int n) { vector >all_now; vector >::iterator it; vector part; part.push_back(1); all.push_back(part); for (int i = 2; i <= n; i++) { all_now.clear(); for (it = all.begin(); it != all.end(); it++) insert(*it, i, all_now); all = all_now; } dis(all); } int main() { vector >all; int n = 3; full_perm(all, n); return 0; }



