思路就是枚举位置,从第一个位置开始枚举,当m大于n的时候,
也就是需要枚举第n+1个位置的时候终止,循环输出ans数组里面的结果
建议画一下递归树和递归的过程,这样比较清晰
n=3的时候一直进行深入遍历,直到遍历到dfs(4)输出结果返回到dfs(3)的运行中。
在dfs(3)中执行后续语句,将st[3]=false,继续执行for,此时i=3=n,for结束
返回到dfs(2)中,执行st[2]=false;继续for循环,执行i=3,也就是第2个位置上面的数字方3,第三个方2…
以此类推
import java.util.Scanner;
public class Main {
/**
* @param args
*/
static int n;
static int ans[]=new int [8];
static boolean st[]=new boolean [8];
public static void dfs(int m) {
if(m>n){
for(int i=1;i<=n;i++){
System.out.print(ans[i]+" ");
}
System.out.println();
}
for(int i=1;i<=n;i++){
if(!st[i]){
ans[m]=i;
st[i]=true;
dfs(m+1);
st[i]=false;
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
n=scanner.nextInt();
dfs(1);
}
}