当前位置: 首页 > news >正文

纯个人整理,蓝桥杯使用的算法模板day1(dfs、bfs)

算法索引

    • dfs(深度优先搜索)
    • bfs(广度优先搜索)
      • 迷宫
      • 树结构

dfs(深度优先搜索)

功能: 适合搜索所有的解
代码模板:

class Solution{
	public void dfs(int[][] graph, int i, int j){
		if(i < 0 || j < 0 || i > graph.length || j > graph[i].length || graph[i][j] != 1){ //超出范围,或不是可遍历路线(1可代表:墙、海等)
			return;
		}
		graph[i][j] = 2; //用图中未出现过的数字,作为旗子🚩,记录走过的路
		dfs(graph, i + 1, j); //向下
		dfs(graph, i, j + 1); //向右
		dfs(graph, i - 1, j); //向上
		dfs(graph, i, j - 1); //向左
	}
}

bfs(广度优先搜索)

功能: 逐层遍历,确保第一次到达目标点的路径就是最短路径
代码模板

迷宫

题目:蓝桥杯官网:1、走迷宫

static final int[][] DIRECTIONS = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; //定义运动方向,上、右、下、左

private static int bfs(int[][] migong, int i, int j, int end_x, int end_y){ //i,j为起始位置,end_x,end_y为终点,返回最短步数
      Queue<int[]> queue = new ArrayDeque<>(); //初始化队列
      queue.offer(new int[]{i, j, 0}); //初始位置,步数初始化为0

      while(!queue.isEmpty()){ //队列不为空
        int[] current = queue.poll(); //取出队列头部元素
        int x = current[0]; //当前横坐标
        int y = current[1]; //当前纵坐标
        int step = current[2]; //当前步数

        if(x == end_x && y == end_y){ //判断是否到达终点
          return step;
        }

        for(int[] dir : DIRECTIONS){ //遍历四个方向
          int new_x = x + dir[0]; //新的坐标位置
          int new_y = y + dir[1];

          if(new_x < rows && new_y < cols && new_x >= 0 && new_y >= 0 && visited[new_x][new_y] == 0 && migong[new_x][new_y] == 1){ //只有同时满足在图内,未访问过,有路的点,才可加入队列
            queue.offer(new int[]{new_x, new_y, step + 1}); //添加新的位置加入队列
            visited[new_x][new_y] = 1; //标记已访问
          }
        }
      }
      return -1; //无法从入口到出口
    }

树结构

class Solution{
	public void List<List<Integer>> bfs(TreeNode root){
		if(root == None){ //遍历为空,返回空列表
			return List.of();
		}
		List<List<Integer>> ans = new ArrayList<>();
		Queue<TreeNode> q = new ArrayDeque<>(); //广度搜索时,临时存储的队列
		q.add(root);
		while(!q.isEmpty()){ //此时的结点不为空
			int n = q.size(); //记录当前层数,结点的个数
			List<Integer> vals = new ArrayList<>(); //记录当前层数的数值
			while(n --> 0){ //每次循环处理一个节点,n 递减 1,直到 n = 0(当前层处理完毕)
				TreeNode node = q.poll(); //移出队列,并存储在新的树结构
				vals.add(node.val); //添加结点的数值
				if(node.left != null){q.add(node.left);} //分别遍历左右子节点
				if(node.right != null){q.add(node.right);}
			}
			ans.add(vals);
		}
	}
}
http://www.dtcms.com/a/98540.html

相关文章:

  • Axure疑难杂症:完美解决中继器筛选问题(时间条件筛选、任性筛选)
  • 信号与系统(郑君里)第一章-绪论 1-22 课后习题解答
  • jdk 支持路线图
  • gamma函数与zeta函数的关系
  • 【大数据技术】大数据技术概念及概述
  • QT音乐播放器(1):数据库保存歌曲
  • Vue Kubernetes项目 局部布局面包屑 el-breadcrumb
  • Matlab教程004:Matlab矩阵的拼接重构重排以及矩阵的运算
  • 测试测试 测试
  • Kubernetes》k8s》Containerd 、ctr 、cri、crictl
  • 每日一题 MySQL基础知识----(四)
  • Java 大视界 -- Java 大数据机器学习模型在电商商品推荐冷启动问题中的解决策略(160)
  • [Python学习日记-88] 并发编程之多进程 —— 队列与生产者消费者模型
  • 赛博威智慧导购平台,融合AI激活一线导购效能,破局增长瓶颈
  • 目标识别与双目测距(1)环境搭建:Ubuntu+yolov5+pcl库
  • JAVA学习*工厂模式
  • Python容器详解:从字符串到字典的完整指南
  • CPT204 Advanced Obejct-Oriented Programming 高级面向对象编程 Pt.4 泛型
  • 4.训练篇2-毕设篇
  • Share01-WinCC文件越用越大?
  • 【学习笔记】文件上传漏洞--js验证、mime验证、.user.ini、短标签、过滤、文件头
  • 大数据Spark(五十五):Spark框架及特点
  • Leetcode 两数相除
  • 海量数据处理
  • 下载和初步上手Vue3路由
  • NOIP2007提高组.矩阵取数游戏
  • 思维链技术(Chain-of-Thought, CoT)
  • 双卡 RTX 5090 深度体验:AI 推理框架选择与性能限制实测
  • HCIP(RSTP+MSTP)
  • 【STL】list