深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.
今天介绍算法实现的两种形式,一种是通过数组交换位置、一种是通过数组保存元素是否被使用
package 搜索.深度优先搜索DFS;
public class Main {
public static int count = 0; //统计数量
//数组交换方式
public static void dfs1(int[] a,int n){
if(n == a.length-1){ //判断是否到达数组结尾
count++;
printArray(a);
return;
}
for (int i = n; i < a.length; i++){
{a[i] = a[n] ^ a[i];a[i] = a[n] ^ a[i];a[n] = a[n] ^ a[i];} //交换位置
dfs1(a,n+1);
{a[i] = a[n] ^ a[i];a[i] = a[n] ^ a[i];a[n] = a[n] ^ a[i];}
}
}
//数组存储状态方式
public static int[] status; //存储状态的数组
public static void dfs2(int[] a, int n){
if(n == a.length){
count++;
printArray(a);
return ;
}
for (int i = 1; i <= a.length;i++){
if(status[i] == 0){
a[n] = i;
status[i] = 1; //1表示该数已被使用;0表示未使用
dfs2(a, n+1);
status[i] = 0;
}
}
}
//输出排列结果
public static void printArray(int[] a){
for (int i = 0; i < a.length; i++){
System.out.print(a[i]);
}
System.out.println();
}
public static void main(String[] ages){
int[] a = new int[6];
//方式一 需要初始排列下数组
for (int i = 1; i <= a.length; i++)
a[i-1] = i;
dfs1(a, 0);
status = new int[6+1];
dfs2(a, 0);
System.out.println(count);
}
}