如何在 Java 中实现深度优先搜索 (DFS)
时间: 2024-09-25 16:04:21 浏览: 41
Java实现深度优先搜索算法(DFS)
在 Java 中实现深度优先搜索 (Depth First Search, DFS) 可以通过递归的方式来完成。下面是基本的步骤:
1. **创建递归函数**:
- 设定一个名为 `dfs` 的递归函数,接收四个参数:当前所在的位置坐标 `(x, y)`,已访问过的格子集合(通常用集合如 HashSet 或 List 存储),当前路径作为字符串(用于构建最终结果),以及整个棋盘 `board`。
2. **基础情况**:
- 当前坐标 `(x, y)` 为棋盘右下角 `(n-1, n-1)` 时,说明已经找到了路径,返回当前路径。
3. **递归步骤**:
- 检查当前位置是否合法:不在边界、数字有效(0 到 k-1)、未访问过,以及不与之前路径交叉(根据题目描述,这里需要检查路径的连续性和无交叉)。
- 如果满足条件,将当前位置添加到已访问集合,并加入当前路径字符串(比如当前方向为 0,则加上 "0"),然后递归地向相邻的四个方向调用 `dfs` 函数(0代表向上,1代表向右,2代表向下,3代表向左,4代表右上方,5代表右下方,6代表左上方,7代表左下方)。
- 递归结束后,记得从已访问集合中移除当前位置,以保证不会重复访问。
4. **初始化和调用**:
- 初始化递归函数,设置起始点为 `(0, 0)`,已访问集合为空,路径字符串开始为空,然后调用 `dfs` 函数。
以下是简化版的伪代码示例:
```java
boolean isValid(int x, int y, Set<String> visited, String currentPath, int[][] board) {
// 校验逻辑...
}
String dfs(int x, int y, Set<String> visited, StringBuilder currentPath, int[][] board) {
if (x == n - 1 && y == n - 1) return currentPath.toString();
if (isValid(x, y, visited, currentPath, board)) {
visited.add(currentPath.toString());
currentPath.append(directionToNumber[currentDir]);
String nextPath = dfs(x + dx[currentDir], y + dy[currentDir], visited, currentPath, board);
visited.remove(currentPath.toString()); // 回溯
if (nextPath != null) return nextPath;
}
return null;
}
// 主函数调用
List<String> directionsToNumber = Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7");
List<int[]> dx = new ArrayList<>(Arrays.asList(new int[]{0, 1, 0, -1, 1, 1, -1, -1}));
List<int[]> dy = new ArrayList<>(Arrays.asList(new int[]{1, 0, -1, 0, 1, -1, 1, -1}));
Set<String> visited = new HashSet<>();
StringBuilder currentPath = new StringBuilder();
String result = dfs(0, 0, visited, currentPath, board);
if (result == null) {
System.out.println("-1"); // 无解
} else {
System.out.println(result); // 输出解
}
```
请注意,这只是一个简化的版本,实际实现时还需要处理边界、交叉检测等细节。
阅读全文