题目描述:输入一个数n,给出这个1~n的全排列。
采用DFS的思维来解决,实际上就是遍历所有情况。
采用递归方式解决全排列问题
public class permutation {
int n;//求到几的全排列
int[] array;//用来存排列的数字
boolean[] flag;//用来表示该数字是否被用过
//全排列构造函数
public permutation(int num) {
this.n = num;
array = new int[num+5];
flag = new boolean[num+5];
Arrays.fill(flag,false);
}
void dfs(int step) {
//判断结束边界值,递归出口
if(step>n) {
for(int i=1;i<=n;i++) {
System.out.print(array[i]);
}
System.out.println();
return;
}
for(int i=1;i<=n;i++) {
if(!flag[i]) {//未被访问过
array[step]=i;//将数字1放入第step个位置
flag[i]=true;//表示第I位的数字已被使用
dfs(step+1);
flag[i]=false;
}
}
}
public static void main(String[] args) {
permutation p =new permutation(3);
p.dfs(1);
}
}
心得
如果把解空间看起是一个有向图(树其实也是图的一种),这种遍历方法就是深度优先搜索;同时,由于在遍历的时候到达叶子结点以后,就会再返回它的上级节点,这种方法又被称为回溯法。这里的回溯是通过栈调用过程实现的。