对于全排序的每一个位置,都可以放任一允许放置的元素(未被使用过)
#include<iostream>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<stack>
#include<fstream>
#include<algorithm>
using namespace std;
void full(map<int,bool>ma,queue<int>out,int cur){//采用map主要是将要排列的元素附加一个标记位,out为输出队列,cur为当前标记位或者说是已经选择的数目
if(cur==ma.size()){//元素全部选完,即已经生成一种全排序
while(!out.empty()){
cout<<out.front();
out.pop();
}
cout<<endl;
return;
}
for(map<int,bool>::iterator iter = ma.begin();iter!=ma.end();iter++){
if(iter->second==true){//此元素未被使用过
queue<int>out1 = out;//保留一个副本作为还原现场用
out.push(iter->first);
iter->second = false;
full(ma,out,cur+1);
//还原现场
iter->second = true;
out = out1;
}
}
}
int main(){
map<int,bool>ma;
for(int i=1;i<=4;i++)ma[i]=true;
queue<int>s2;
full(ma,s2,0);
return 0;
}