虽然在课上学习过深度搜索,但也没在实际敲代码时应用过,在看了阿哈磊的算法书,用深度搜索的方法解决全排列的问题。“理解深度优先搜索的关键在于解决“当下该如何做”。至于“下一步该怎么做”则与“当下该如何做”是一样的”来自书中的原话。所以在DFS中主要用了递归,废话不多说,现在上代码。
package pratice;
import java.util.Scanner;
public class dfs {
static int n=10;
static int[] book = new int[10];
static int[] a = new int[10];
static void dfs1(int step){
if(step==n+1){
for(int i=1;i<=n;i++){
System.out.print(a[i]);
}
System.out.println();
return ;
}
for(int i=1;i<=n;i++){
if(book[i]==0){
a[step]=i;
book[i]=1;
dfs1(step+1);
book[i]=0;
}
}
return ;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
n=input.nextInt();
dfs1(1);
input.close();
}
}
DFS的基本模型为:
void dfs(int step){
判读边界
尝试每一种可能for(int i=1;i<=n;i++)
{
继续下一步 dfs(step+1);
}
返回
在上述问题中主要的一步还有dfs(step+1)后的book[i]=0,这表示在进行完每次排列后则要将该牌收回以便下次的放牌,利用book数组可提高效率。√GET!