给定一个数n,输出n的全排列
如n=2时(2!种)
- 1 2
- 2 1
n=3(3!种)
- 1 2 3
- 1 3 2
- 2 1 3
- 2 3 1
- 3 1 2
- 3 2 1
递归回溯思路:挖坑填数
1.结束条件:所有的坑都填满了,即长度>=n。得到一个解,保存或返回。
2.递归主体
- 从第一个坑往后填数
- 数不能重复,所以要用到数组判重
- 这个坑填好,递归去填下一个坑,
- 回溯。。。
4.感觉,回溯不就是利用了递归返回上一层的性质吗。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int flag[100];
void dfs(int len,string s,vector<string>& ans,int n){
if(len>=n){
ans.push_back(s);
return;
}
for(int j=1;j<=n;j++){
if(flag[j]==0){
flag[j]=1;
dfs(len+1,s+to_string(j),ans,n);
flag[j]=0;
}
}
}
int main(void)
{
int n;
cin>>n;
int i=0;
string tep;
vector<string>ans;
dfs(0,tep,ans,n);
int cot=0;
for(auto a:ans){
cout<<a<<endl;
cot++;
}
cout<<cot<<"种";
}