每一层都要把所有数字全排列的原因是,如果像ppt里一样做,下一层全排列的数组会跟上一层不一样,就要重新写数组
再排列,还不如每次都排同一个数组,虽然递归确实把所有问题都分解成相同问题,但这些问题的基础条件并不相同,也不能用递归做,递归需要满足不止问题的解决方法相同,基础条件也相同,否则就非常麻烦
#includeusing 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 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 scanf("%d",&b[i]); } dfs(1);//从第一层遍历 }



