本题是深度优先搜索的模板题,开一个 bool 数组用来判断当前这个数字是否已经被使用了。第一个位置的数字是第 0 层,第二个位置的数字是第一层,以此类推。用 u 表示当前深度优先搜索到了第几层,每次递归调用 dfs。当深搜到所需求的 n 层时,输出已经记录的数组。在每次完成一次搜索时,应该让判断数组和答案数组都还原成原来的样子,进行下一次排列。
#include<iostream>
using namespace std;
int ans[123];
bool tag[123];
int n;
void dfs(int u){
if(u==n){ //满足题目所需的层数即输出
for(int i=0;i<n;i++){
printf("%5d",ans[i]);
}
printf("\n");
return;
}
for(int i=1;i<=n;i++){
if(!tag[i]){
ans[u]=i;
tag[i]=1; //标记为已使用防止重复使用
dfs(u+1);
//ans[u]=0; //因为ans[u]的值一直被覆盖,所以可以不用还原。
tag[i]=0; //使得bool数组置0,即未使用的初态
}
}
}
int main(){
cin>>n;
dfs(0);
}