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.mzph.cn/news/688458.shtml

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

相关文章

代码随想录算法训练营第五十二天| 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

198.打家劫舍 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 解题思路&#xff1a;类似于上台阶&#xff0c;但相邻元素不能相加 java&#xff1a; class Solution {public int rob(int[] nums) {if (nums null || nums.le…

Java多线程系列——锁

0.引言 在并发编程中&#xff0c;锁是一种重要的同步机制&#xff0c;用于控制对共享资源的访问。Java 提供了多种锁的实现&#xff0c;每种锁都有不同的特性和适用场景。本文将深入介绍 Java 中常见的锁类型&#xff0c;包括内置锁、显式锁、读写锁等&#xff0c;并讨论它们的…

设计usb转ttl模块的一些问题

这个是我之前设计的usb转ttl模块&#xff0c;用到的是CH340N芯片&#xff0c;目前遇到的问题以及疑问有以下几个&#xff0c;望大佬们解答&#xff1a; 1 想设计的是一块可以选择3.3V或者5V输出&#xff0c;所以我用了在TTL输出那里加了VCC、VCC3.3V、5V这几个引脚&#xff0c…

114 C++ lambda表达式捕获模式的陷阱分析和展示

一 捕获列表中的 & 捕获外部作用域中的所有变量&#xff0c;&#xff08;不包括静态变量&#xff0c;静态变量不需要捕获&#xff09;&#xff0c;并作为引用在lambda表达式中使用 按照引用这种捕获方式&#xff0c;会导致lambda表达式包含绑定到局部变量的引用。 问题发…

EXCEL中不错的xlookup函数

excel中一般要经常用vlookup函数&#xff0c;但其实经常麻烦要正序&#xff0c;从左边到右边&#xff0c;还要数列&#xff0c;挺麻烦的&#xff0c;xlookup的函数还不错&#xff0c;有个不错的一套视频介绍,B站的&#xff0c;地址是&#xff1a;XLOOKUP函数基础用法&#xff0…

rust的哈希表

新建哈希表 fn main() { use std::collections::HashMap;let mut scores HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50);println!("{:?}",scores); }访问某个元素 fn main() { use …

GB 18585-2023 壁纸中有害物质限量

壁纸/墙布因其色彩多样&#xff0c;图案丰富&#xff0c;施工方便&#xff0c;价格便宜等多种优势&#xff0c;广泛应用于室内装修材料&#xff0c;在国内&#xff0c;日本&#xff0c;欧美等地区非常普及。 GB 18585-2023壁纸中有害物质限量测试项目&#xff1a; 测试项目 测…

Eliminating Domain Bias for Federated Learning in Representation Space【文笔可参考】

文章及作者信息&#xff1a; NIPS2023 Jianqing Zhang 上海交通大学 之前中的NeurIPS23论文刚今天传到arxiv上&#xff0c;这次我把federated learning的每一轮看成是一次bi-directional knowledge transfer过程&#xff0c;提出了一种促进server和client之间bi-direction…

Day4. 文件IO的基本概念和读写

温习&#xff1a; 文件的拷贝&#xff08;单个字符&#xff09;(fgetc/fputc) #include <stdio.h>int main(void) {FILE* fp NULL;FILE* fq NULL;char ch 0;fp fopen("str.txt","r");if (fp NULL){perror("file to fopen!");retur…

网络模型及传输基本流程

1.OSI 七层模型 OSI &#xff08; Open System Interconnection &#xff0c;开放系统互连&#xff09;七层网络模型称为开放式系统互联参考模型&#xff0c;是一个逻辑上的定义和规范; 把网络从逻辑上分为了 7 层 . 每一层都有相关、相对应的物理设备&#xff0c;比如路由器…

RCS系统之:冲突解决

在RCS系统中&#xff0c;避免碰撞是至关重要的。以下是一些常见的方法和技术用于避免碰撞&#xff1a; 障碍物检测&#xff1a;机器人可以配备各种传感器&#xff0c;如激光雷达、超声波传感器、摄像头等&#xff0c;用于检测周围的障碍物和环境。通过实时监测周围情况&#xf…

插值与拟合算法介绍

在数据处理和科学计算领域,插值与拟合是两种极为重要的数据分析方法。它们被广泛应用于信号处理、图像处理、机器学习、金融分析等多个领域,对于理解和预测数据趋势具有至关重要的作用。本文将深入浅出地介绍这两种算法的基本原理,并结合C语言编程环境探讨如何在CSDN开发者社…

力扣:139. 单词拆分

动态规划&#xff1a; 1.先声明dp数组的含义为下标i表示的是在s变量中i前面的字符串是否在wordDict变量中存在&#xff0c;初始化dp【0】来进行后面dp数组的递推。同时要判断截取的值是否在wirdDict中是否存在&#xff0c;还要判断dp【j】的下标的j前面的字符串是否也在wirdDi…

数组常见算法代码总结

一、数组排序【冒泡排序】&#xff08;优化&#xff09; 1.基本实现思路: 数组排序是通过冒泡排序算法实现的&#xff0c;基本实现思路是比较相邻的元素&#xff0c;把小的元素往前移动或把大的元素往后移动&#xff0c;相邻元素两两进行比较&#xff0c;若大元素在小元素前面…

RocketMQ订阅关系不一致和不能消费时如何排查?

订阅关系不一致 调整任意一个实例的订阅关系和另一个保持一致 消费者不能消费消息 它是最常见的问题之一&#xff0c;也是每个消息队列服务都会遇到的问题 1.确认哪个消息未消费。在这时消费者至少需要手机消息id、消息key、消息发送时间段三者之一 2.确认消息是否发送成功…

HashMap使用静态初始化块添加元素

使用静态初始化块&#xff08;Static Initialization Block&#xff09; 示例代码&#xff1a; import java.util.HashMap; import java.util.Map;public class Main {public static void main(String[] args) {// 使用静态初始化块批量添加元素Map<String, Integer> h…

JVM--- 垃圾收集器详细整理

目录 一、垃圾收集需要考虑的三个事情&#xff1a; 二、垃圾回收针对的区域 三、如何判断对象已死 1.引用计数算法&#xff1a; 2.可达性分析算法 四、引用 五、生存还是死亡&#xff1f; 六、回收方法区 七、垃圾收集算法 1.分代收集理论 2.标记-清除算法 3.标记-复制算…

huggingface库LocalTokenNotFoundError:需要提供token

今天刚开始学习huggingface&#xff0c;跑示例的时候出了不少错&#xff0c;在此记录一下&#xff1a; (gpu) F:\transformer\transformers\examples\pytorch\image-classification>.\run.bat Traceback (most recent call last):File "F:\transformer\transformers\e…

一站式安装对应显卡版本的cuda和torch(windows)

前言 一年前&#xff0c;安装过cuda&#xff0c;觉得并不难&#xff0c;就没有记录。 这次安装还算顺利&#xff0c;就是在找资料的时候&#xff0c;浪费了不少时间 这次就记录下来&#xff0c;方便以后再次安装 总结安装程序&#xff1a; 1、安装python环境 2、安装VS的C环境&…

【机构vip教程】Unittest(1):unittest单元测试框架简介

unittest单元测试框架简介 unittest是python内置的单元测试框架&#xff0c;具备编写用例、组 织用例、执行用例、功能&#xff0c;可以结合selenium进行UI自动化测 试&#xff0c;也可以结合appium、requests等模块做其它自动化测试 官方文档&#xff1a;https://docs.pytho…