DFS深度优先算法理解: 深度优先算法,顾名思义就是就一直往下走直到不能走为止,找到一个答案之后,返回上一层再找到答案,直到将所有情况都遍历完。 注意 就是返回到上一层的时候,记得恢复原状(恢复到刚到这一层时候的样子),比如下面例子:如果两层之间有联系(每个数字只能选择一次)如果第三个数字选择3进行标记,递归返回到第二次选择时,如果没进行取消标记,则第二次不能选择3则错误
题目: AcWing 842. 排列数字 给定一个整数 n,将数字 1~n 排成一排,将会有很多种排列方法。 现在,请你按照字典序将所有的排列方法输出。
输入格式 共一行,包含一个整数 n。
输出格式 按字典序输出所有排列方案,每个方案占一行。
数据范围 1≤n≤7
输入样例:
3
输出样例:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
#include <iostream>
#include <vector>
using namespace std;
const int N=10;
int visit[N],path[N];
int n;
void dfs(int k)
{
if(k==n){
for(int i=0;i<n;i++)cout<<path[i]<<" ";
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
{
if(visit[i]==0)
{
path[k]=i;
visit[i]=1;
dfs(k+1);
visit[i]=0;
}
}
}
int main()
{
cin>>n;
dfs(0);
return 0;
}
|