迷宫最短路径

定义一个二维数组: int maze[n][m]; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

int maze[6][7] = {
0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 1, 1, 1, 0,
0, 1, 0, 0, 0, 1, 0,
0, 1, 0, 1, 0, 0, 0,
0, 1, 0, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0,
};

输出:

(0,0)
(1,0)
(2,0)
(2,1)
(2,2)
(2,3)
(2,4)
(3,4)
(4,4)

 

class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}

public String toString() {
return "{(" + x + "," + y + ")}";
}
}

class Main {

public List<Point> fun(int[][] maze) {
List<List<Point>> res = new ArrayList<>();
// 第一步
//创建一个 ArrayList<Integer> step 记录步数
List<Point> step = new ArrayList<>();
int n = maze.length;
int m = maze[0].length;
//调用 dfs 函数
dfs(maze, 0, 0, n, m, step, res);

// 第三步
//得到结果 筛选最短路径
int size = Integer.MAX_VALUE;
int index = 0;
for (int i = 0; i < res.size(); i++) {
if (res.get(i).size() < size) {
size = res.get(i).size();
index = i;
}
}

//第三步
//将最短路径保存并输出
step = res.get(index);

return step;
}


public void dfs(int[][] maze, int i, int j, int n, int m, List<Point> step, List<List<Point>> res) {
// 越界 、 有墙 、 已经走过
if (i < 0 || i >= n || j < 0 || j >= m || maze[i][j] == 1 || maze[i][j] == 2) {
return;
}
//添加当前坐标
step.add(new Point(i, j));
//如果到达终点
if (i == n - 1 && j == m - 1) {
res.add(new ArrayList<>(step));
} else {
//标记为已经走过
maze[i][j] = 2;
// 递归
dfs(maze, i + 1, j, n, m, step, res);
dfs(maze, i, j + 1, n, m, step, res);
dfs(maze, i - 1, j, n, m, step, res);
dfs(maze, i, j - 1, n, m, step, res);
// 回溯
maze[i][j] = 0;
}
//回溯
step.remove(step.size() - 1);
}

}
posted @   MarkLeeBYR  阅读(95)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示