当前位置:   article > 正文

蓝桥杯Java——DFS深度优先搜索算法_java dfs算法

java dfs算法

目录

基本概念

算法思想

模板

例子


基本概念

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

算法思想

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

模板

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

例子

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

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

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

法1

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

法2

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

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

  1. public class Main {
  2. public static int N=10;
  3. public static int e[][]=new int[N][N];//存储二极管相邻的信息
  4. public static int f[]=new int[N];//并查集
  5. public static int ans=0;
  6. public static boolean st[]=new boolean[N];//true表示发光
  7. public static void init(){
  8. //表示相邻
  9. //1 2 3 4 5 6 7
  10. //a b c d e f g
  11. e[1][2]=e[1][6]=1;//a与b、f相邻
  12. e[2][1]=e[2][7]=e[2][3]=1;//b与a、g、c相邻
  13. e[3][2]=e[3][7]=e[3][4]=1;//c与b、g、d相邻
  14. e[4][3]=e[4][5]=1;//d与c、e相邻
  15. e[5][7]=e[5][6]=e[5][4]=1;//e与g、f、d相邻
  16. e[6][5]=e[6][7]=e[6][1]=1;//f与e、g、a相邻
  17. e[7][2]=e[7][3]=e[7][5]=e[7][6]=1;//g与b、c、e相邻
  18. }
  19. public static int find(int u){
  20. if(f[u]==u) return u;
  21. f[u]=find(f[u]);
  22. return f[u];
  23. }
  24. public static void dfs(int d){//1-7
  25. if(d>7){
  26. //终止条件
  27. for(int i=1;i<=7;i++){//并查集初始化
  28. f[i]=i;
  29. }
  30. for(int i=1;i<=7;i++){
  31. for(int j=1;j<=7;j++){
  32. if(e[i][j]==1&&st[i]==true&&st[j]==true){//把所有发光且相邻的二极管合并
  33. int fx=find(i),fy=find(j);
  34. if(fx!=fy){
  35. f[fx]=fy;//合并
  36. }
  37. }
  38. }
  39. }
  40. int k=0;//表示产生的集合的个数
  41. for(int i=1;i<=7;i++){
  42. if(st[i] &&f[i]==i)k++;
  43. }
  44. if(k==1) ans++;//只产生一个集合,说明所有的发光二极管是连成一片的
  45. return;
  46. }
  47. st[d]=true;
  48. dfs(d+1);
  49. st[d]=false;
  50. dfs(d+1);
  51. }
  52. public static void main(String[] args) {
  53. init();
  54. dfs(1);
  55. System.out.println(ans);
  56. }
  57. }

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

闽ICP备14008679号