设计婚纱网站,宁波网站优化服务,北京门户网站建设公司,官网网站建设企业目录
一、Dfs算法的概念
二、Dfs算法的设计步骤
三、Dfs算法模板
四、Dfs算法经典例题
#xff08;1#xff09;全排列
#xff08;2#xff09;N皇后 一、Dfs算法的概念 Depth First Search 即 DFS#xff0c;意为深度优先搜索#xff0c;是所有的搜索手段之一。它…目录
一、Dfs算法的概念
二、Dfs算法的设计步骤
三、Dfs算法模板
四、Dfs算法经典例题
1全排列
2N皇后 一、Dfs算法的概念 Depth First Search 即 DFS意为深度优先搜索是所有的搜索手段之一。它是从某个状态开始不断进行状态转移直到不能转移后向后回退一直到遍历完所有的状态。 作为搜索算法的一种DFS 主要是用于解决 NP 完全问题。但是深度优先搜索算法的时间复杂度较高深度优先搜索是 O(n!) 的阶乘级算法它的效率非常低在数据规模变大时此算法就难以解决当前的问题了。 二、Dfs算法的设计步骤 按照定义设计 确定该题目的状态包括边界 找到状态转移方式 找到问题的出口计数或者某个状态 设计搜索 int check(参数)
{if(满足条件)return 1;return 0;
}
bool pd(参数){相应操作
}
void dfs(int step)
{判断边界pd(){不在边界内即回溯}尝试每一种可能{满足check条件标记继续下一步dfs(step1)恢复初始状态回溯的时候要用到}
} 三、Dfs算法模板 public static int dfs(int step){if(当前状态目标状态){return ...;}for(查找新状态){标记状态;dfs(下一状态);撤销状态标记也就是回溯;}} 四、Dfs算法经典例题
1全排列 题目描述 按照字典序输出自然数 11 到 n 所有不重复的排列即 n 的全排列要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 n。 输出格式 由 1∼1∼n 组成的所有不重复的数字序列每行一个序列。 每个数字保留 55 个场宽。 输入输出样例 输入 #1复制 3 输出 #1复制 1 2 31 3 22 1 32 3 13 1 23 2 1说明/提示 1≤≤91≤n≤9。
import java.util.*;public class Main {static int[] vnew int[20];//判断数i是否访问static int n;static int[] anew int[20];//保存方案public static void main(String[] args) {Scanner scannernew Scanner(System.in);nscanner.nextInt();dfs(1);}public static void dfs(int x){//x表示第几个数了if(x3){for(int i1;in;i){System.out.print(a[i] );}System.out.println();}for(int i1;in;i){if(v[i]0){a[x]i;v[i]1;dfs(x1);v[i]0;}}}
} 2N皇后 N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后 要求任何两个皇后不同行不同列也不在同一条斜线上 求给一个整数 n 返回 n 皇后的摆法数。 数据范围: 1≤≤91≤n≤9 要求空间复杂度 (1)O(1) 时间复杂度 (!)O(n!) 例如当输入4时对应的返回值为2 对应的两种四皇后摆位如下图所示 示例1 输入 1 复制返回值 1复制 示例2 输入 8 复制返回值 92import java.util.*;public class Main {static int[] zxnew int[200];//左斜static int[] yxnew int[200];//右斜static int[] linew int[30];//列static int n;static int sum0;//记录方案数public static void main(String[] args) {Scanner scannernew Scanner(System.in);nscanner.nextInt();dfs(1);System.out.println(sum);}public static void dfs(int s){//s表示当前第几行if(sn){sum;}//循环找第几列for(int i1;in;i){if(check(s,i)){li[i]1;zx[si]1;yx[s-i100]1;dfs(s1);li[i]0;zx[si]0;yx[s-i100]0;}}}public static boolean check(int x,int y){//判断x,y)是否满足条件if(li[y]0zx[xy]0yx[x-y100]0){return true;}else{return false;}}}