问题
按照字典顺序打印从1到正整数N的全排列
递归写法
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;
vector<list<int>> getPermutations(int n)
{
if (n == 1)
{
vector<list<int>> res;
res.push_back(list<int>(1, 1));
return res;
}
vector<list<int>> resN_1 = getPermutations(n - 1);
vector<list<int>> resN;
for (vector<list<int>>::iterator it = resN_1.begin(); it != resN_1.end(); it++)
{
list<int> item = *it;
for (int i = 0; i < n; i++)
{
list<int> item_(item);
list<int>::iterator it_ = item_.begin();
for (int j = 0; j < i; j++)
{
it_++;
}
item_.insert(it_, n);
resN.push_back(item_);
}
}
return resN;
}
class Mycompare
{
public:
bool operator()(list<int> v1, list<int> v2)
{
if (v1.size() != v2.size())
{
return true;
}
int n = v1.size();
list<int>::iterator it1 = v1.begin();
list<int>::iterator it2 = v2.begin();
while (it1 != v1.end() && it2 != v2.end())
{
int e1 = *it1;
int e2 = *it2;
if (e1 > e2)
{
return false;
}
else if (e1 < e2)
{
return true;
}
it1++;
it2++;
}
return true;
}
};
int main()
{
vector<list<int>> res = getPermutations(3);
sort(res.begin(), res.end(), Mycompare());
for (vector<list<int>>::iterator it = res.begin(); it != res.end(); it++)
{
list<int> item = *it;
for (list<int>::iterator it_ = item.begin(); it_ != item.end(); it_++)
{
cout << *it_ << "\t";
}
cout << endl;
}
return 0;
}
python
def getPermutations(n):
if(n==1):
return [[1]]
resN_1=getPermutations(n-1)
resN=[]
for item in resN_1:
for i in range(n):
# 防止浅拷贝的问题
item_=item[:]
item_.insert(i,n)
resN.append(item_)
return resN
if __name__=='__main__':
print(getPermutations(5))
深度优先搜索(DFS)写法
#include <iostream>
#include <stack>
#include <set>
#include <vector>
using namespace std;
vector<stack<int>> getPermutations(int n)
{
vector<stack<int>> res;
int K = 1;
for (int i = 1; i < n; i++)
{
K *= i;
}
for (int i = 1; i <= n; i++)
{
stack<int> s;
s.push(i);
int lastPop = 0;
set<int> candidateQueue;
for (int j = 1; j <= n; j++)
{
candidateQueue.insert(j);
}
candidateQueue.erase(i);
int k = 0;
while (k < K)
{
if (candidateQueue.size())
{
s.push(*candidateQueue.begin());
candidateQueue.erase(candidateQueue.begin());
if (lastPop)
{
candidateQueue.insert(lastPop);
lastPop = 0;
}
}
else
{
if (lastPop)
{
candidateQueue.insert(lastPop);
}
lastPop = s.top();
if (s.size() == n)
{
res.push_back(s);
k++;
}
s.pop();
}
}
}
return res;
}
int main()
{
vector<stack<int>> res = getPermutations(9);
for (vector<stack<int>>::iterator it = res.begin(); it != res.end(); it++)
{
stack<int> s = *it;
vector<int> v;
while (s.size())
{
v.push_back(s.top());
s.pop();
}
for (int i = v.size() - 1; i >= 0; i--)
{
cout << v.at(i) << "\t";
}
cout << endl;
}
return 0;
}