纯个人整理,蓝桥杯使用的算法模板day1(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);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值