思路 依次枚举 每个位置用哪个数字
要求按照字典序最小来输出
而每次搜索下一层时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;
}