当前位置:   article > 正文

Java实现Dfs算法(基本讲解)_dfs算法模版java

dfs算法模版java

目录

一、Dfs算法的概念

二、Dfs算法的设计步骤

三、Dfs算法模板

四、Dfs算法经典例题

(1)全排列

(2)N皇后


一、Dfs算法的概念

Depth First Search 即 DFS,意为深度优先搜索,是所有的搜索手段之一。它是从某个状态开始,不断进行状态转移,直到不能转移后,向后回退,一直到遍历完所有的状态。

作为搜索算法的一种,DFS 主要是用于解决 NP 完全问题。但是,深度优先搜索算法的时间复杂度较高,深度优先搜索是  O(n!) 的阶乘级算法,它的效率非常低,在数据规模变大时,此算法就难以解决当前的问题了。

二、Dfs算法的设计步骤

按照定义设计:

  1. 确定该题目的状态(包括边界)

  2. 找到状态转移方式

  3. 找到问题的出口,计数或者某个状态

  4. 设计搜索

  1. int check(参数)
  2. {
  3. if(满足条件)
  4. return 1;
  5. return 0;
  6. }
  7. bool pd(参数){
  8. 相应操作
  9. }
  10. void dfs(int step)
  11. {
  12. 判断边界pd()
  13. {
  14. 不在边界内,即回溯
  15. }
  16. 尝试每一种可能
  17. {
  18. 满足check条件
  19. 标记
  20. 继续下一步dfs(step+1)
  21. 恢复初始状态(回溯的时候要用到)
  22. }
  23. }

三、Dfs算法模板

  1. public static int dfs(int step){
  2. if(当前状态=目标状态){
  3. return ...;
  4. }
  5. for(查找新状态){
  6. 标记状态;
  7. dfs(下一状态);
  8. 撤销状态标记,也就是回溯;
  9. }
  10. }

四、Dfs算法经典例题

(1)全排列

题目描述

按照字典序输出自然数 11 到 �n 所有不重复的排列,即 �n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式

一个整数 �n。

输出格式

由 1∼�1∼n 组成的所有不重复的数字序列,每行一个序列。

每个数字保留 55 个场宽。

输入输出样例

输入 #1复制

3

输出 #1复制

    1    2    3
    1    3    2
    2    1    3
    2    3    1
    3    1    2
    3    2    1

说明/提示

1≤�≤91≤n≤9。

  1. import java.util.*;
  2. public class Main {
  3. static int[] v=new int[20];//判断数i是否访问
  4. static int n;
  5. static int[] a=new int[20];//保存方案
  6. public static void main(String[] args) {
  7. Scanner scanner=new Scanner(System.in);
  8. n=scanner.nextInt();
  9. dfs(1);
  10. }
  11. public static void dfs(int x){
  12. //x表示第几个数了
  13. if(x>3){
  14. for(int i=1;i<=n;i++){
  15. System.out.print(a[i]+" ");
  16. }
  17. System.out.println();
  18. }
  19. for(int i=1;i<=n;i++){
  20. if(v[i]==0){
  21. a[x]=i;
  22. v[i]=1;
  23. dfs(x+1);
  24. v[i]=0;
  25. }
  26. }
  27. }
  28. }

(2)N皇后

N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后,
要求:任何两个皇后不同行,不同列也不在同一条斜线上,
求给一个整数 n ,返回 n 皇后的摆法数。

数据范围: 1≤�≤91≤n≤9

要求:空间复杂度 �(1)O(1) ,时间复杂度 �(�!)O(n!)

例如当输入4时,对应的返回值为2,

对应的两种四皇后摆位如下图所示:

示例1

输入:

1

复制返回值:

1

复制

示例2

输入:

8

复制返回值:

92
  1. import java.util.*;
  2. public class Main {
  3. static int[] zx=new int[200];//左斜
  4. static int[] yx=new int[200];//右斜
  5. static int[] li=new int[30];//列
  6. static int n;
  7. static int sum=0;//记录方案数
  8. public static void main(String[] args) {
  9. Scanner scanner=new Scanner(System.in);
  10. n=scanner.nextInt();
  11. dfs(1);
  12. System.out.println(sum);
  13. }
  14. public static void dfs(int s){
  15. //s表示当前第几行
  16. if(s>n){
  17. sum++;
  18. }
  19. //循环找第几列
  20. for(int i=1;i<=n;i++){
  21. if(check(s,i)){
  22. li[i]=1;
  23. zx[s+i]=1;
  24. yx[s-i+100]=1;
  25. dfs(s+1);
  26. li[i]=0;
  27. zx[s+i]=0;
  28. yx[s-i+100]=0;
  29. }
  30. }
  31. }
  32. public static boolean check(int x,int y){
  33. //判断(x,y)是否满足条件
  34. if(li[y]==0&&zx[x+y]==0&&yx[x-y+100]==0){
  35. return true;
  36. }
  37. else{
  38. return false;
  39. }
  40. }
  41. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/933001
推荐阅读
相关标签
  

闽ICP备14008679号