W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
大家好,我是 V 哥。深度優(yōu)先搜索(DFS)是一種圖遍歷算法,它優(yōu)先深入到某條路徑的盡頭,再回溯到前一個節(jié)點繼續(xù)探索其他路徑,直到找到目標或遍歷完整個圖。DFS的應用場景廣泛,可以用于路徑搜索、連通性判斷、迷宮求解等。以下是一個典型的DFS實現(xiàn)示例以及分析它在不同業(yè)務場景中的應用。
以下為一個Java實現(xiàn)的DFS算法示例,用于在一個二維矩陣中尋找從起點到終點的路徑。該矩陣中1表示可以通過的點,0表示障礙物。目標是找到從起點(0,0)到終點(m-1,n-1)的路徑。
public class DFSMazeSolver {
private static final int[] DX = {-1, 1, 0, 0}; // 行移動方向:上,下
private static final int[] DY = {0, 0, -1, 1}; // 列移動方向:左,右
public boolean dfs(int[][] maze, int x, int y, boolean[][] visited) {
int rows = maze.length;
int cols = maze[0].length;
// 邊界條件與目標判斷
if (x < 0 || y < 0 || x >= rows || y >= cols || maze[x][y] == 0 || visited[x][y]) {
return false;
}
// 到達終點
if (x == rows - 1 && y == cols - 1) {
return true;
}
// 標記當前位置已訪問
visited[x][y] = true;
// 遞歸地探索四個方向
for (int i = 0; i < 4; i++) {
int newX = x + DX[i];
int newY = y + DY[i];
if (dfs(maze, newX, newY, visited)) {
return true;
}
}
// 回溯
visited[x][y] = false;
return false;
}
public boolean canSolveMaze(int[][] maze) {
int rows = maze.length;
int cols = maze[0].length;
boolean[][] visited = new boolean[rows][cols];
return dfs(maze, 0, 0, visited);
}
public static void main(String[] args) {
int[][] maze = {
{1, 0, 0, 0},
{1, 1, 0, 1},
{0, 1, 0, 0},
{1, 1, 1, 1}
};
DFSMazeSolver solver = new DFSMazeSolver();
if (solver.canSolveMaze(maze)) {
System.out.println("路徑可達");
} else {
System.out.println("無可行路徑");
}
}
}
dfs
方法用于在當前位置(x
,y
)開始深度優(yōu)先搜索。rows-1
,cols-1
)時,返回true
。在機器人路徑規(guī)劃和無人機飛行路徑規(guī)劃中,DFS算法可以用來尋找從起點到目標點的可行路徑。DFS適合在地圖較小且需要找到任意一條可行路徑的場景。以下是一個在網格地圖上實現(xiàn)DFS的完整Java代碼示例,模擬機器人或無人機在二維平面上尋找從起點到目標點的路徑。
假設網格中的0表示障礙物,1表示可通行區(qū)域。目標是從起點(0, 0)到終點(m-1, n-1)找到一條通路。
import java.util.ArrayList;
import java.util.List;
public class RobotPathPlanner {
// 定義四個方向:上,下,左,右
private static final int[] DX = {-1, 1, 0, 0};
private static final int[] DY = {0, 0, -1, 1};
private static final String[] DIRECTION = {"Up", "Down", "Left", "Right"};
// 存儲路徑
private List<String> path = new ArrayList<>();
// 深度優(yōu)先搜索算法
public boolean dfs(int[][] grid, int x, int y, boolean[][] visited) {
int rows = grid.length;
int cols = grid[0].length;
// 邊界條件:檢查是否越界,是否遇到障礙物,是否已訪問
if (x < 0 || y < 0 || x >= rows || y >= cols || grid[x][y] == 0 || visited[x][y]) {
return false;
}
// 如果到達終點位置,路徑規(guī)劃成功
if (x == rows - 1 && y == cols - 1) {
path.add("(" + x + "," + y + ")");
return true;
}
// 標記當前節(jié)點為已訪問
visited[x][y] = true;
path.add("(" + x + "," + y + ")");
// 遍歷四個方向進行遞歸搜索
for (int i = 0; i < 4; i++) {
int newX = x + DX[i];
int newY = y + DY[i];
if (dfs(grid, newX, newY, visited)) {
path.add(DIRECTION[i]);
return true;
}
}
// 回溯:撤銷當前路徑點的訪問
path.remove(path.size() - 1);
visited[x][y] = false;
return false;
}
public List<String> findPath(int[][] grid) {
int rows = grid.length;
int cols = grid[0].length;
boolean[][] visited = new boolean[rows][cols];
if (dfs(grid, 0, 0, visited)) {
return path;
} else {
path.add("No Path Found");
return path;
}
}
public static void main(String[] args) {
int[][] grid = {
{1, 0, 0, 0},
{1, 1, 0, 1},
{0, 1, 1, 0},
{1, 0, 1, 1}
};
RobotPathPlanner planner = new RobotPathPlanner();
List<String> path = planner.findPath(grid);
System.out.println("規(guī)劃路徑:");
for (String step : path) {
System.out.println(step);
}
}
}
DX
和DY
分別代表在網格上移動的方向數(shù)組,DIRECTION
數(shù)組用于記錄方向名稱,便于輸出路徑。dfs
方法從指定位置(x, y)
開始搜索,檢查越界、障礙物和訪問狀態(tài)。true
,并將路徑記錄到path
列表。findPath
調用dfs
,并根據(jù)DFS結果返回路徑或“未找到路徑”的提示。機器人路徑規(guī)劃:在倉儲物流中,機器人需要規(guī)劃從起點到指定位置的路徑,避開障礙物(如貨架),通過DFS可以找到一條可行的路徑。
無人機飛行路徑規(guī)劃:在室內或復雜地形中,無人機可以通過DFS找到安全飛行路線,避開障礙物,確保抵達目的地。DFS適用于場地相對較小且只需找到一條路徑的場景。
關注威哥愛編程,編碼路上V哥陪你不寂寞。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: