题目描述:打印1
到n
的全排列
以n=3为例,全排列为:
123
132
213
231
312
321
方法一:采用深度优先搜索的方法
程序代码:
public class FullPermutation1 {
public static void main(String[] args) {
int n = 3;
DFS(0,"",n);
}
//深度优先搜索(递归)
public static void DFS(int depth,String ans,int n) {
if(depth==n) {
System.out.println(ans);
return ;
}
for(int i=1;i<=n;i++) {
if(!ans.contains(""+i)) {
DFS(depth+1,ans+i,n);
}
}
}
}
方法二:采用广度优先搜索的方法
程序代码:
import java.util.LinkedList;
import java.util.Queue;
public class FullPermutation2 {
public static void main(String[] args) {
int n = 3;
BFS(n);
}
//广度优先搜索(队列)
public static void BFS(int n) {
Queue<String> q = new LinkedList<String>();
for(int i=1;i<=n;i++) {
q.offer(""+i);
}
while(!q.isEmpty()) {
String head = q.poll();//弹出队列头
//开枝散叶
for(int j=1;j<=n;j++) {
if(head.contains(""+j)) continue;
String son = head+j;
if(son.length()==n) {
System.out.println(son);
} else {
q.offer(son);
}
}
}
}
}
方法三:回溯递归
程序代码:
public class FullPermutation3 {
public static int[] a = new int[10];
public static int[] b = new int[10];
public static int n = 3;
public static void main(String[] args) {
dfs(1);
}
public static void dfs(int step) {//当前在第几个位置
if(step==n+1) {//前n个数字已经放好
for(int i=1;i<=n;i++) System.out.print(a[i]);
System.out.println();
return ;
}
//每次都从1到n,逐步尝试
for(int i=1;i<=n;i++) {
if(b[i]==0) {//这个数字是否用过
a[step]=i;//没用过,这个位置就放i
b[i]=1;//标记i已经被用过,防止再用
dfs(step+1);//放好这个数字后,下一个数字,展开是一棵树
b[i]=0;//回溯,当满足一种全排列后,下一个尝试
}
}
return ;
}
}