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);
}
}
}