蓝桥杯Java——DFS深度优先搜索算法
目录
基本概念
算法思想
模板
例子
基本概念
深度优先搜索算法(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深度优先搜索算法相关推荐
- 水洼数 DFS 蓝桥杯 java代码
水洼数 DFS 蓝桥杯 java代码 有一个大小为N * M的院子,雨后积起了水,八连通的积水被认为是连在一起的,请求出园子里面总共有多少水洼 限制条件 N, M <=100 10 12 W.. ...
- 2017蓝桥杯java B组纸牌三角形
2017蓝桥杯java B组纸牌三角形 1.标题:纸牌三角形 A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算).要求每个边的和相等. 下图就是一种排法 A 9 6 4 8 ...
- 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2021.04.18】
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[题目下载.2013年(第4届)~2020年(第11届)] CSDN 蓝桥杯 专栏 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结 ...
- 蓝桥杯java备赛Day3——跳马
蓝桥杯java备赛A组--跳马 问题描述 问题描述: 一个8×8的棋盘上有一个马初始位置为(a,b),他想跳到(c,d),问是否可以?如果可以,最少要跳几步? 输入格式: a,b,c,d 输出格式: ...
- 2017年 第08届 蓝桥杯 Java B组 决赛真题详解及小结
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 ...
- 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2020.7.5】
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...
- 2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.7.5】
蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...
- 2018年 第9届 蓝桥杯 Java B组 省赛真题详解及总结
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...
- 2016年 第7届 蓝桥杯 Java B组 省赛解析及总结
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...
最新文章
- Windows10快捷应用指令
- 利用双向循环链表实现长整数的存储_链表看这一篇真的就够了!
- 程序员,假如生活欺骗了你
- 编程求文件file1中数据的平均值,并将其与平均值最接近的数删除
- 许昌网络企业网站建设的10个理由
- 翻译 | 2015年的最佳Material Design集锦 【上篇】
- Leaflet中使用Leaflet.Spin插件实现地图加载等待效果
- HMAC算法及其应用
- mysql架构 视频_企业常见MySQL架构应用实战(高可用集群系统+调优经验)视频课程...
- java项目log4j_java项目测试log4j
- CSDN上传资源时一直提示 请填写资源tag
- 【Flink】 Flink 源码之 SQL 执行流程
- windows server 2008 DC 活动目录备份还原
- VK Cup 2012 Round 1 D. Distance in Tree (树形dp)
- 计算机毕设 ai_2020年计算机人工智能方向保研经历分享(南大,复旦,中科院计算所)...
- 软件随想--写牛B的代码
- 超好用的团队计划管理软件,推荐给大家~
- 微博 用户画像_微博的用户画像是怎样构建的
- 设置笔记本为无线wifi发射器
- 副业新风口:TikTok(海外抖音)搬运视频,1天1小时!一月3W!(可批量操作)...
热门文章
- 精通Spring_4.x__企业应用开发实战PDF分享
- docker(11):安全
- php遍历数组替换内容,PHP使用数组依次替换字符串中匹配项
- 【读书笔记】SQL必知必会
- ConcurrentHashmap核心源码分析(一)
- 世界杯php源码 haoid,DoYouHaoBaby(PHP开发框架)v2.5.2 Release20130727
- org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.fs.FileAlreadyExistsException)
- 从零开始的Django框架入门到实战教程(内含实战实例) - 01 创建项目与app、加入静态文件、模板语法介绍(学习笔记)
- 记一次做双人在线五子棋小游戏
- Unity的timeScale影响范围