#include<bits/stdc++.h>
using namespace std;
const int N=20;
int a[N];
bool mark[N];//计算n个元素的全排列
int n;
void dfs(int u)
{
if(u==n)
{
for(int i=0;i<n;i++)
cout<<a[i];
cout<<" ";
return ;
}
for(int i=1;i<=n;i++)
{
if(mark[i]==false)//这个元素没有被访问过
{
mark[i]=true;
a[u]=i;//把第i个元素放到a数组里边
dfs(u+1);
mark[i]=false;
a[u]=0;
}
}
}
int main()
{
cin>>n;
dfs(0);
return 0;
}
之前学的dfs全都忘记了~~
n的全排列问题,最关键的难以理解的地方就是函数里边的for循环部分
第一步就是i==1时候,a[0]=1, mark[1]=true
进入dfs(1),i==1不成立,i==2时 a[1]=2, mark[2]=true;
dfs(2) ,i==1,i==2不成立, i==3,a[2]=3, mark[3]=true;
输出123 将mark[3]置为false,a[2]=0,进入dfs(1),将mark[2]置为false,a[1]=0,
此时dfs(1),循环进入到i==3,mark[3]=false,因此a[1]=3,mark[3]置为true,
进入dfs(2),i==1,条件不成立,i==2,mark[2]=true,a[2]=2,,进入dfs(3),输出132.
总结来说就是,已经遍历过1了,然后遍历2,3,然后回溯到2的那个地方,这里相当于循环到2,然后再循环到3,原来的mark[3]和a[2]都置为初始状态,然后dfs(2)的时候再从i==1到i==3找,此时
mark[1]和mark[3]都已经访问过,只能访问2,再往下和上边的过程一样