Java实现Dfs算法(基本讲解)

目录

一、Dfs算法的概念

二、Dfs算法的设计步骤

三、Dfs算法模板

四、Dfs算法经典例题

(1)全排列

(2)N皇后


一、Dfs算法的概念

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

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

二、Dfs算法的设计步骤

按照定义设计:

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

  2. 找到状态转移方式

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

  4. 设计搜索

int check(参数)
{if(满足条件)return 1;return 0;
}
bool pd(参数){相应操作
}
void dfs(int step)
{判断边界pd(){不在边界内,即回溯}尝试每一种可能{满足check条件标记继续下一步dfs(step+1)恢复初始状态(回溯的时候要用到)}
}

三、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[] v=new int[20];//判断数i是否访问static int n;static int[] a=new int[20];//保存方案public static void main(String[] args) {Scanner scanner=new Scanner(System.in);n=scanner.nextInt();dfs(1);}public static void dfs(int x){//x表示第几个数了if(x>3){for(int i=1;i<=n;i++){System.out.print(a[i]+" ");}System.out.println();}for(int i=1;i<=n;i++){if(v[i]==0){a[x]=i;v[i]=1;dfs(x+1);v[i]=0;}}}
}

(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

import java.util.*;public class Main {static int[] zx=new int[200];//左斜static int[] yx=new int[200];//右斜static int[] li=new int[30];//列static int n;static int sum=0;//记录方案数public static void main(String[] args) {Scanner scanner=new Scanner(System.in);n=scanner.nextInt();dfs(1);System.out.println(sum);}public static void dfs(int s){//s表示当前第几行if(s>n){sum++;}//循环找第几列for(int i=1;i<=n;i++){if(check(s,i)){li[i]=1;zx[s+i]=1;yx[s-i+100]=1;dfs(s+1);li[i]=0;zx[s+i]=0;yx[s-i+100]=0;}}}public static boolean check(int x,int y){//判断(x,y)是否满足条件if(li[y]==0&&zx[x+y]==0&&yx[x-y+100]==0){return true;}else{return false;}}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/477947.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

22-k8s中pod的调度-亲和性affinity

一、概述 在k8s当中&#xff0c;“亲和性”分为三种&#xff0c;节点亲和性、pod亲和性、pod反亲和性&#xff1b; 亲和性分类名称解释说明nodeAffinity节点亲和性通过【节点】标签匹配&#xff0c;用于控制pod调度到哪些node节点上&#xff0c;以及不能调度到哪些node节点上&…

2.19学习总结

1.中位数 2.统计和 3.铺设道路 4.岛屿个数 5.冶炼金属 6.飞机降落 7.接龙数列 中位数https://www.luogu.com.cn/problem/P1168 题目描述 给定一个长度为 &#xfffd;N 的非负整数序列 &#xfffd;A&#xff0c;对于前奇数项求中位数。 输入格式 第一行一个正整数 &#xfff…

NoSQL 数据库有哪些类型?

NoSQL 数据库主要可以分为下面四种类型&#xff1a; 键值&#xff1a;键值数据库是一种较简单的数据库&#xff0c;其中每个项目都包含键和值。这是极为灵活的 NoSQL 数据库类型&#xff0c;因为应用可以完全控制 value 字段中存储的内容&#xff0c;没有任何限制。Redis 和 D…

使用openeuler 22.03替代CentOS 7.9,建立虚拟机详细步骤

进入浏览器搜索网址下载openeuler 22.03镜像文件 https://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS-SP3/ISO/x86_64/openEuler-22.03-LTS-SP3-x86_64-dvd.iso 打开VMware Workstation新建一个虚拟机&#xff1a; 自定义虚拟机位置 加入下载好的openeuler镜像文件…

Mysql的隔离级别和锁

Mysql的事务隔离级别 脏读&#xff1a;读到了未提交的数据 2、不可重复读&#xff1a; 两次读取的数据中间被修改&#xff0c;读取的数据不同。 幻读 数据库锁 悲观锁和乐观锁 死锁 一般发生在多线程执行过程中&#xff0c;因为争抢资源造成线程之间相互等待&#xff0c;这…

数据结构中图的概念以及遍历算法的实现

在数据结构中&#xff0c;图&#xff08;Graph&#xff09;是由节点&#xff08;Vertex&#xff09;和连接节点的边&#xff08;Edge&#xff09;组成的一种非线性数据结构。图可以用来表示各种实际问题中的关系和连接&#xff0c;如社交网络、道路网络、电路等。 图由两个主要…

.ma1x0勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

尊敬的读者&#xff1a; 数据安全问题备受关注。而勒索病毒是其中一种最为恶劣的威胁之一。其中&#xff0c;.ma1x0勒索病毒备受人们担忧&#xff0c;因其可将用户的数据文件加密&#xff0c;并要求支付赎金以解密文件。本文将介绍.ma1x0勒索病毒的特征、预防方法以及如何恢复…

stable diffusion官方版本复现

踩了一些坑&#xff0c;来记录下 环境 CentOS Linux release 7.5.1804 (Core) 服务器RTX 3090 复现流程 按照Stable Diffusion的readme下载模型权重、我下载的是stable-diffusion-v1-4 版本的 1 因为服务器没法上huggingface&#xff0c;所以得把权重下载到本地&#xff…

17.3.1.4 浮雕

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 浮雕的算法主要有以下两种&#xff1a; 1、相邻两个像素的红绿蓝颜色分量值差再加上一个常数。例如&#xff1a;从第二列像素开始&…

大白话说说redux

redux的3个重要概念 store 就是用来存放应用的各种状态的action 就是用来描述应用发生了什么动作的&#xff0c;注意理解他是对动作的描述reducer 就是用来处理应用的动作&#xff0c;并且决定怎么去更新应用存放在store里面的状态。 redux的3个原则 应用的所有状态存储为re…

K8s进阶之路-核心概念/架构:

架构&#xff1a;Master/Node Master组件--主控节点{ 负责集群管理&#xff08;接收用户事件转化成任务分散到node节点上&#xff09;} Apiserver&#xff1a; 资源操作的唯一入口&#xff0c;提供认证、授权、API注册和发现等机制 Scheduler &#xff1a; 负责集群资源调度&am…

【Larry】英语学习笔记语法篇——非谓语动词和从句是一回事

目录 非谓语动词和从句是一回事 不定式&#xff1a;名词/形容词/副词 1、不定式 名词属性的不定式&#xff1a;作为主语、表语、宾语 形容词属性的不定式&#xff1a;作后置定语 副词属性的不定式&#xff1a;作状语 副词属性的不定式&#xff1a;作插入语 不定式的逻辑…