思路说明参考 :https://blog.csdn.net/wonengguwozai/article/details/84634423
#include <iostream>
#include <vector>
using namespace std;
int n;
void dfs(vector<int>& nums,int level,vector<bool>& visited,vector<int>& tmp,vector<vector<int>>& results)
{
//每次搜索的结束条件
if(level == n)
results.push_back(tmp);
else
{
for(int i=0;i<n;i++)
{
if(visited[i]==0)
{
visited[i] = 1;//被访问标记
tmp.push_back(nums[i]);
dfs(nums,level+1,visited,tmp,results);//以level+1为根进行遍历
tmp.pop_back();
visited[i] = 0;//进行回溯
}
}
}
}
int main()
{
int k,m;
vector<int> nums;//需要全排列的元素
vector<vector<int>> results;//存储最后所有全排列的结果
vector<int> tmp;//存储每一次排列组合的结果
vector<bool> visited(nums.size(),false);//存储每个值是否被访问,即有存储位置
while(cin>>k)
{
nums.push_back(k);
if(cin.get()=='\n')
break;
}
n = nums.size();
dfs(nums,0,visited,tmp,results);//以第一个位置0为根开始深度遍历
m = results.size();
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cout<<results[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
DFS基本模板:
dfs()
{
判断边界
{
相应条件
}
尝试每一种可能
{
满足check条件
标记
继续下一步dfs(step+1)
恢复初始状态(回溯条件)
}
}