一、DFS模板:
int check(参数)
{
if(满足条件)
return 1;
return 0;
}
void dfs(int step)
{
判断边界
{
相应操作
}
尝试每一种可能
{
满足check条件
标记
继续下一步dfs(step+1)
恢复初始状态(回溯的时候要用到)
}
}
二、常见应用
1.全排列问题
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr= {1,2,3,4};
FullSort(arr,0,arr.length-1);
}
public static void FullSort(int[]arr,int start,int end) {
if(start==end) {
for(int i:arr) {
System.out.print(i);
}
System.out.println();
return;
}
for(int i=start;i<=end;i++) {
swap(arr,i,start);
FullSort(arr,start+1,end);
swap(arr,i,start);
}
}
private static void swap(int[] arr,int i,int j) {
arr[i]=arr[i]+arr[j];
arr[j]=arr[i]-arr[j];
arr[i]=arr[i]-arr[j];
}
}
2.素数环问题
public class Main {
public static int n=6;
public static boolean[] visit=new boolean[n+1]; //标记某数是否被使用
public static int[] arr=new int[n+1]; //存放素数列
public static void main(String[] args) {
arr[0]=0;
for(int i=0;i<=n;i++) {
visit[i]=false;
}
dfs(1);
}
public static void dfs(int cur) {
if(cur==n+1&&isp(arr[1]+arr[n])&&arr[1]==1) {
//如果最后一个数放进去了,并且最后一个数和第一个的和为质数,并且第一个数是1(因为我们只输出开头是1的,避免重复)
for(int i=1;i<=n;i++) {
System.out.print(arr[i]+" "); //打印素数环
}
System.out.println();
}else {
for(int i=1;i<=n;i++) {
if(!visit[i]&&isp(i+arr[cur-1])) {
//如果这个数没有被使用,并且与前一个数的和是素数
visit[i]=true; //表示这个数正在被使用
arr[i]=i; //将这个数放入队列
dfs(cur+1); //取下一个数
visit[i]=false; //取消这个数
}
}
}
}
public static boolean isp(int n) {
for(int i=2;i<Math.sqrt(i);i++) {
if(n%i==0) {
return false;
}
}
return true;
}
}
参考https://blog.csdn.net/ldx19980108/article/details/76324307
本文改为Java语言实现