每一层都要把所有数字全排列的原因是,如果像ppt里一样做,下一层全排列的数组会跟上一层不一样,就要重新写数组
再排列,还不如每次都排同一个数组,虽然递归确实把所有问题都分解成相同问题,但这些问题的基础条件并不相同,也不能用递归做,递归需要满足不止问题的解决方法相同,基础条件也相同,否则就非常麻烦
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int a[maxn];
bool vis[maxn];
int b[maxn];
int n;
void dfs(int step)
{
if(step==n+1)
{
for(int i=1;i<step;i++)//打印答案
cout<<a[i]<<" ";
cout<<endl;
return;
}
for(int i=0;i<n;i++)//从小到大遍历每个数字(因为要求全排列,所以从小到大遍历)
{
if(!vis[i])//如果这个数字还没用过
{
a[step]=b[i];//那么该层就用这个数字
vis[i]=true;//标记这个数字用过
dfs(step+1);//递归到下一层
vis[i]=false;//这个数字用完了,给它标记成没用过
}
}
return;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++){
scanf("%d",&b[i]);
}
dfs(1);//从第一层遍历
}