问题描述
迷宫问题求解
• 使用深度优先的方法解决迷宫问题
• 规定迷宫的最外围为一圈墙,给出起点和终点要求输出一条正确的路径,但不要求为最短路径
• 使用opencv实现可视化,演示一个动态求解迷宫的过程
1)在迷宫求解问题上,看似些许有些难度,但是其实很简单,用一种称为广度搜索的算法,将玩家选定的初始点为出发点,向四周搜索可通行的位置,算法的设计:下—>右—>上—>左—>下,根据这个一直搜索下去。直到找到终点,否则,显示错误。
2)为了避免多次检验是否走到边沿,将迷宫周围各镶上一条取值为九的边,相当于在迷宫的周围布上一圈无法通过的墙。
3)为了避免有的点被重复到达,应标志通过的位置,可以采取一个栈来标记已通过的位置,当进入死胡同的时候进行回溯。
4)当无解的时候进行错误输出即可。
源码如下
public class Maze implements MouseListener {
static Grid[][] grid;
static MyStack path;
static Position start;
static Position end;
static int WIDTH;
static int HEIGHT;
JTextField start1;
JTextField end1;
JTextField out;
boolean isMousePressed;
public Maze(int width, int height) {
WIDTH = width + 2;
HEIGHT = height + 2;
grid = new Grid[WIDTH][HEIGHT];
this.layout(width + 2, height + 2);
}
private void layout(int width, int height) {
int sideLength = 40;
int frameWidth = sideLength * width + 20;
int frameHeight = sideLength * (height + 2) + 32;
JFrame frame = new JFrame();
frame.setTitle("Maze Solution");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setSize(frameWidth, frameHeight);
frame.addMouseListener(this);
frame.setLayout(null);
int i;
for(i = 1; i < width - 1; ++i) {
for(int j = 1; j < height - 1; ++j) {
grid[i][j] = new Grid();
grid[i][j].addMouseListener(this);
frame.add(grid[i][j]);
grid[i][j].setBounds(sideLength * i, sideLength * j, sideLength, sideLength);
}
}
for(i = 1; i < width - 1; ++i) {
grid[0][i] = new Grid(i);
frame.add(grid[0][i]);
grid[0][i].setBounds(sideLengt