经典迷宫问题DFS

给定一个迷宫,入口为左上角,出口为右下角,问是否有路径从入口到出口,若有则输出一条这样的路径。注意移动可以从上、下、左、右、上左、上右、下左、下右八个方向进行。迷宫输入0表示可走,输入1表示墙。易得可以用1将迷宫围起来避免边界问题。

本题采用DFS算法给出解。

/*
迷宫问题(八方向)
input:
1
6 8
0 1 1 1 0 1 1 1
1 0 1 0 1 0 1 0
0 1 0 0 1 1 1 1
0 1 1 1 0 0 1 1
1 0 0 1 1 0 0 0
0 1 1 0 0 1 1 0
output:
YES
(1,1) (2,2) (3,1) (4,1) (5,2) (5,3) (6,4) (6,5) (5,6) (4,5) (4,6) (5,7) (5,8) (6,8) (递归)
(1,1) (2,2) (3,3) (3,4) (4,5) (5,6) (5,7) (6,8) (栈)
*/
#include<iostream>
#include<stack>
using namespace std;
struct point{
    int x;
    int y;
};
int **Maze;
stack<point> sp;
point move[8]={
  {-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
void Create(int row,int column){
    //创建迷宫,注意到用0表示可走,1表示墙&
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,下面是一个使用深度优先搜索(DFS解决迷宫问题的Java代码示例: ```java import java.util.Stack; public class MazeSolver { private int[][] maze; private boolean[][] visited; private int startRow, startCol; private int endRow, endCol; public MazeSolver(int[][] maze, int startRow, int startCol, int endRow, int endCol) { this.maze = maze; this.visited = new boolean[maze.length][maze[0].length]; this.startRow = startRow; this.startCol = startCol; this.endRow = endRow; this.endCol = endCol; } public boolean solve() { Stack<Integer> stack = new Stack<>(); stack.push(startRow); stack.push(startCol); while (!stack.isEmpty()) { int col = stack.pop(); int row = stack.pop(); if (row < 0 || col < 0 || row >= maze.length || col >= maze[0].length) { continue; } if (visited[row][col] || maze[row][col] == 1) { continue; } visited[row][col] = true; if (row == endRow && col == endCol) { return true; } stack.push(row + 1); stack.push(col); stack.push(row - 1); stack.push(col); stack.push(row); stack.push(col + 1); stack.push(row); stack.push(col - 1); } return false; } public static void main(String[] args) { int[][] maze = { {0, 1, 0, 0}, {0, 1, 0, 1}, {0, 0, 0, 0}, {0, 1, 1, 0} }; MazeSolver solver = new MazeSolver(maze, 0, 0, 3, 3); if (solver.solve()) { System.out.println("Maze solved!"); } else { System.out.println("Maze cannot be solved!"); } } } ``` 这个示例中,我们使用了一个栈来实现DFS算法,每次从栈中弹出一个坐标,然后检查是否越界、已经访问过或者是墙壁,如果是,则忽略这个坐标,否则标记为已访问并将其四周的坐标入栈。如果最终栈为空,则说明无法从起点到达终点,否则,说明找到了一条能够从起点到达终点的路径。 这只是一个简单的示例,实际上,如果要解决更复杂的迷宫问题,需要使用更高级的算法来优化搜索过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值