如果你觉得这篇题解对你有用,可以点个赞或关注再走呗,谢谢你的关注~
递归实现排列型枚举
方法:依次去枚举哪个位置应该放哪些数
维护used[]
数组和st[]
数组
used[]
表示的是这个数被用过,true
表示的是被用过,false
表示的是未被用过。
st[]
表示的是当前这个位置插入的数
走到叶子节点,就去遍历1-n
每个数,如果这个数被用过,就输出这个数。
每次输出一个方案,输出方案后就换行。
那么如何去确保字母序?
这里其实有个技巧:出题人想偷个懒,所以我们只需要从小到大去枚举每个数,得到的每种方案就是按字母序排出的答案,是正确的。
注意:
这里N
要取大于9
的数,下标从1
开始
ACcode
import java.util.*;
public class Main{
static int N=10,n;
//注意这里N要取大于9的数,下标从1开始
static boolean used[]=new boolean[N];
static int st[]=new int[N];
public static void dfs(int u){
if(u>n){
//如果走到了叶子节点,就输出现在的答案
for(int i=1;i<=n;i++){
if(used[i]) {
//如果被用过就输出答案
System.out.print(st[i]+" ");
}
}
System.out.println();
//每一种情况输出后就换行输出
return;
}
for(int i=1;i<=n;i++){
if(!used[i]){
//如果没有被用过
//就将i放到当前位置
st[u]=i;
used[i]=true;
//再把i标记为被使用过
dfs(u+1);
//再往下递归
//恢复现场
st[u]=0;
used[i]=false;
}
}
}
public static void main(String []args){
Scanner in=new Scanner(System.in);
n=in.nextInt();
dfs(1);
}
}
头像mbv,名字寸铁,赞的