目录

基本概念

算法思想

模板

例子


基本概念

深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。

算法思想

沿着树的深度来遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

模板

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

例子

第13届蓝桥杯第1期上台阶

public class Main {private static int INF = 0x3f3f3f3f;static int a[] = {0,1,2,1,1,1,1,5,5,4,-1,-1,-2,-3,-1,-9};public static void main(String[] args) {dfs(0,0);System.out.println(dfs(0,0));}static int dfs(int idx, int k) {//idx是台阶数,k是步数if(idx == 15){return a[15];//最后一阶-9}if(k == 6) {//6步return -INF;}int ans = -INF;//得分for(int i=1;i <= 4 && idx + i <= 15;i++){ans = Math.max(ans, dfs(idx + i, k + 1));}return ans + a[idx];}
}

第11届蓝桥杯第1场分配口罩

法1

import java.util.Scanner;public class Main{static int sum, cnt = 0x3f3f3f3f, value[] = new int[15];
//宏定义一个0x3f3f3f3f可以减少考虑的时间,一般情况下就可以当作是一个无穷大的数去用public static void main(String[] args) {Scanner in = new Scanner(System.in);for (int i = 0; i < 15; i++)sum += value[i] = in.nextInt();//口罩总数dfs(0, 0);System.out.print(cnt);//口罩之差}static void dfs(int d, int v) {//d是口罩批数,v是医院分得的口罩数if (d == 15) cnt = min(cnt, abs(sum - v - v));//口罩之差else {dfs(d + 1, v + value[d]);dfs(d + 1, v);}}static int min(int a, int b) { return a < b? a: b; }static int abs(int a) { return a > 0? a: -a; }
}

法2

public class Main {public static long res=Long.MAX_VALUE;public static long num[]={9090400, 8499400, 5926800, 8547000, 4958200,4422600, 5751200, 4175600, 6309600, 5865200, 6604400, 4635000, 10663400, 8087200, 4554000}; public static void main(String[] args){dfs(0, 0, 0);System.out.println(res);}
//k是口罩批数,sum1和sum2两家医院分得的口罩数public static void dfs(int k,long sum1,long sum2 ) {if(k==15) {res=res < Math.abs(sum1-sum2) ? res:Math.abs(sum1-sum2);return;}dfs(k+1, sum1+num[k], sum2);dfs(k+1, sum1, sum2+num[k]);}
}

第11届蓝桥杯第2场七段码

public class Main {public static int N=10;public static  int e[][]=new int[N][N];//存储二极管相邻的信息public static int f[]=new int[N];//并查集public static int ans=0;public static boolean st[]=new boolean[N];//true表示发光public static void init(){//表示相邻//1 2 3 4 5 6 7//a b c d e f ge[1][2]=e[1][6]=1;//a与b、f相邻e[2][1]=e[2][7]=e[2][3]=1;//b与a、g、c相邻e[3][2]=e[3][7]=e[3][4]=1;//c与b、g、d相邻e[4][3]=e[4][5]=1;//d与c、e相邻e[5][7]=e[5][6]=e[5][4]=1;//e与g、f、d相邻e[6][5]=e[6][7]=e[6][1]=1;//f与e、g、a相邻e[7][2]=e[7][3]=e[7][5]=e[7][6]=1;//g与b、c、e相邻}public static int find(int u){if(f[u]==u) return u;f[u]=find(f[u]);return f[u];}public static void dfs(int d){//1-7if(d>7){//终止条件for(int i=1;i<=7;i++){//并查集初始化f[i]=i;}for(int i=1;i<=7;i++){for(int j=1;j<=7;j++){if(e[i][j]==1&&st[i]==true&&st[j]==true){//把所有发光且相邻的二极管合并int fx=find(i),fy=find(j);if(fx!=fy){f[fx]=fy;//合并}}}}int k=0;//表示产生的集合的个数for(int i=1;i<=7;i++){if(st[i] &&f[i]==i)k++;}if(k==1) ans++;//只产生一个集合,说明所有的发光二极管是连成一片的return;}st[d]=true;dfs(d+1);st[d]=false;dfs(d+1);}public static void main(String[] args) {init();dfs(1);System.out.println(ans);}
}

蓝桥杯Java——DFS深度优先搜索算法相关推荐

  1. 水洼数 DFS 蓝桥杯 java代码

    水洼数 DFS 蓝桥杯 java代码 有一个大小为N * M的院子,雨后积起了水,八连通的积水被认为是连在一起的,请求出园子里面总共有多少水洼 限制条件 N, M <=100 10 12 W.. ...

  2. 2017蓝桥杯java B组纸牌三角形

    2017蓝桥杯java B组纸牌三角形 1.标题:纸牌三角形 A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算).要求每个边的和相等. 下图就是一种排法 A 9 6 4 8 ...

  3. 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2021.04.18】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[题目下载.2013年(第4届)~2020年(第11届)] CSDN 蓝桥杯 专栏 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结 ...

  4. 蓝桥杯java备赛Day3——跳马

    蓝桥杯java备赛A组--跳马 问题描述 问题描述: 一个8×8的棋盘上有一个马初始位置为(a,b),他想跳到(c,d),问是否可以?如果可以,最少要跳几步? 输入格式: a,b,c,d 输出格式: ...

  5. 2017年 第08届 蓝桥杯 Java B组 决赛真题详解及小结

    ​​​​​蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 ...

  6. 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2020.7.5】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...

  7. 2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.7.5】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  8. 2018年 第9届 蓝桥杯 Java B组 省赛真题详解及总结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...

  9. 2016年 第7届 蓝桥杯 Java B组 省赛解析及总结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...

最新文章

  1. Hadoop集群三种作业调度算法介绍
  2. 关于MVC项目目录结构调整的想法
  3. C#操作SQLite数据库增、删、改、查 实例
  4. pcu tps_Mac版Microsoft Office 2011重新定义您的TPS报告体验
  5. LeetCode 245. 最短单词距离 III
  6. 关于二叉树的程序 c语言,请教关于建立二叉树程序(c语言的)
  7. vscode用鼠标滚轮_前端开发神器 VSCode 使用总结
  8. 2018年第31周-hive支持的Delete和Update的配置
  9. Linux流行病毒家族清除方法集锦
  10. 设置tomcat内存
  11. ref:LDAP入门
  12. ubuntu系统下vscode字体显示异常(别扭)
  13. Python对话框使用
  14. php导入mib表,导入mib库并获取负载均衡F5的Mib信息
  15. cp: omitting directory ‘./.local/lib/python3.9/site-packages/.’
  16. 两条线段的交点的计算
  17. kafka安装部署和使用
  18. 35岁程序员失业了,找不到合适工作?看完让人心疼……
  19. android 电子书源码,翻页效果
  20. Java的主要应用领域有哪些?

热门文章

  1. pytorch优化器: optim.SGD optimizer.zero_grad()
  2. 从脑成像技术到麦克斯韦方程(CT成像原理与电磁波概念)
  3. 微服务架构下该如何技术选型?
  4. 漏洞分析丨cve-2012-0003
  5. 圣诞节静态HTML网页作业作品 大学生圣诞网页设计制作成品 简单DIV CSS布局网站
  6. 基于C++实现房贷计算器的设计
  7. 图的存储结构:邻接矩阵与邻接表(稠密图与稀疏图)
  8. itextPDF5.5.13 pdf加水印的权限控制
  9. Diameter数据类型
  10. 【玩转IDEA】那些年装过的idea插件,用了都说好