
思路 依次枚举 每个位置用哪个数字
要求按照字典序最小来输出
而每次搜索下一层时i都是从1开始
也就是说 如果有小的数可以填上 那么该方案会填上这个数字
例如 当n等于3
第一次搜索
1 2 3输出后返回
返回后此时i=3 第二个位置填3
1 3 2 输出后返回
此时返回到第一层
i来到2
第一个位置填2
1 还没被用过
因此
2 1 3
以此推类
代码
#include<iostream>
 #include<algorithm>
 #include<string>
 using namespace std;
 int n;
 const int N=10;
 int st[N];
 bool used[N]; 
 void dfs(int u){
     if(u>n){
         for(int i=1;i<=n;i++){
             cout<<st[i]<<' ';
         }
         cout<<endl;
         return;
     }
     for(int i=1;i<=n;i++){
         if(!used[i]){
             //如果该数没被用过 将位置填入该数 
             used[i]=true;
             st[u]=i;
             dfs(u+1);
             //搜索下一层  
             used[i]=false;//恢复现场 
             st[u]=0;//恢复现场
              
         }
     }
     
 }
 int main(){
     cin>>n;
     dfs(1);
     
     
     return 0;
 }#include<iostream>
 #include<algorithm>
 #include<string>
 using namespace std;
 int n;
 const int N=10;
 int st[N];
 bool used[N]; 
 void dfs(int u){
     if(u>n){
         for(int i=1;i<=n;i++){
             cout<<st[i]<<' ';
         }
         cout<<endl;
         return;
     }
     for(int i=1;i<=n;i++){
         if(!used[i]){
             //如果该数没被用过 将位置填入该数 
             used[i]=true;
             st[u]=i;
             dfs(u+1);
             //搜索下一层  
             used[i]=false;//恢复现场 
             st[u]=0;//恢复现场
              
         }
     }
     
 }
 int main(){
     cin>>n;
     dfs(1);
     
     
     return 0;
 }