Java-复杂迷宫求解

    最近用C学了数据结构的迷宫求解问题,但是个人感觉用C实现特别麻烦。索性用Java来实现了。总体的思路不太复杂:首先创建一个栈结构,可以方便的输出最短的路径,然后就是合理的运用递归的思想来进行路径的回溯。先上代码。

interface Method{//实现迷宫的栈结构的接口
    int MAX = 50;//栈的最大存储量,也就是路径的最长量
    void StackInit(StackList stackList);//初始化
    void StackAdd(StackList stackList, place Number);//插入
    void StackDelete(StackList stackList);//删除
    void Display(StackList stackList);//打印(测试用)
}


class StackList{//栈结构
    place[] data;
    int size;
    int capacity;
}

class My_Method implements Method{//实现栈相关方法的类
    @Override
    public void StackInit(StackList stackList) {
        if(stackList == null){
            return;
        }
        stackList.data = new place[MAX];
        stackList.capacity = MAX;
        stackList.size = 0;
    }

    @Override
    public void StackAdd(StackList stackList, place Number) {
        if(stackList == null){
            return;
        }
        if(stackList.size == stackList.capacity){
            return;
        }
        stackList.data[stackList.size] = Number;
        stackList.size++;
    }

    @Override
    public void StackDelete(StackList stackList) {
        if(stackList == null){
            return;
        }
        if(stackList.size == 0){
            return;
        }
        stackList.size--;
    }

    @Override
    public void Display(StackList stackList) {
        if(stackList == null){
            return;
        }
        for(int i = 0;i<stackList.size;i++){
            System.out.print(" "+stackList.data[i]);
        }
    }
}
//-----------------------------------------------------------

interface Maze_Method{//有关迷宫地图的实现方法的接口
    int ROW = 6;//迷宫的行与列
    int COL = 6;
    boolean Exit(Maze maze,place now_place,place start);//检查是不是出口
    void mark(Maze maze, place now_place, place prev_place);//做标记
    boolean CanStay(Maze maze, place now_place, place prev_place);//判断是否可以落到这个位置上
    void Walk(Maze maze, place start, place now_place, place prev_place, StackList cur, StackList _short, Method My_Test);//递归函数
    void Init(Maze maze);//初始化地图
    void Display(Maze maze);//打印地图
}
interface Maze_area{
    int ROW = 6;//迷宫的大小
    int COL = 6;
}

class Maze implements Maze_area{//迷宫地图
    int[][] map = new int[ROW][COL];
}

class My_Maze_Method implements Maze_Method{//实现迷宫相关的方法

    @Override
    public void Init(Maze maze) {//初始化地图
        int[][] New_Map = new int[][]{{0,1,0,0,0,0},
                                      {1,1,0,0,0,0},
                                      {0,1,0,1,1,1},
                                      {1,1,1,1,0,0},
                                      {0,0,0,1,0,0},
                                      {0,0,0,1,0,0,}};
        maze.map = New_Map;
    }

    @Override
    public void Display(Maze maze) {//打印地图
        for(int i = 0;i<maze.map.length;i++){
            for(int j = 0;j<maze.map[0].length;j++){
                System.out.print(" "+ maze.map[i][j]);
            }
            System.out.println();
        }
    }

    @Override
    public boolean Exit(Maze maze, place now_place, place start) {//检查是否是出口
        if(now_place == start){
            return false;
        }
        if(now_place.row == 0 || now_place.row == ROW-1 || now_place.col == 0 || now_place.col == COL-1){
            return true;
        }
        return false;
    }

    @Override
    public boolean CanStay(Maze maze, place now_place, place prev_place) {//检查某位置是否合法
        if((now_place.row >= ROW) || (now_place.row < 0) || (now_place.col >= COL) || (now_place.col < 0)){
            return false;
        }
        if(maze.map[now_place.row][now_place.col] == 0){
            return false;
        }
        if(maze.map[now_place.row][now_place.col] == 1){
            return true;
        }
        if(maze.map[prev_place.row][prev_place.col] > (maze.map[now_place.row][now_place.col] + 1)){
            return true;
        }
        return false;
    }

    @Override
    public void mark(Maze maze, place now_place, place prev_place) {//标记一个位置
        if (prev_place.row == -1 && prev_place.col == -1) {

            maze.map[now_place.row][now_place.col] = 2;
        } else {
            maze.map[now_place.row][now_place.col] = maze.map[prev_place.row][prev_place.col] + 1;
        }
    }

    @Override
    public void Walk(Maze maze, place start, place now_place, place prev_place, StackList cur, StackList _short, Method My_test) {//递归函数
        if(!CanStay(maze,now_place,prev_place)){//看是否可以在这个位置走
            return;
        }
        mark(maze,now_place,prev_place);//做标记
        My_test.StackAdd(cur,now_place);//将能走的地方入栈

        if(Exit(maze,now_place,start)){//如果是出口,那么把cur栈和_short栈的大小做比较,
            if(_short.size == 0) {//把比较小的那个保存在_short栈中
                _short.data = cur.data;
                _short.size = cur.size;
                _short.capacity = cur.capacity;
            }
            if(_short.size > cur.size){
                _short.data = cur.data;
                _short.size = cur.size;
                _short.capacity = cur.capacity;
            }
            My_test.StackDelete(cur);//如果是出口,那么删除栈顶,回溯
            System.out.println("找到一个出口");
            return;
        }
//顺时针扫描一个位置的上下左右
        place up = new place(now_place.row-1,now_place.col);
        prev_place = now_place;
        Walk(maze,start,up,prev_place,cur,_short,My_test);

        place right = new place(now_place.row,now_place.col+1);
        prev_place = now_place;
        Walk(maze,start,right,prev_place,cur,_short,My_test);

        place down = new place(now_place.row+1,now_place.col);
        prev_place = now_place;
        Walk(maze,start,down,prev_place,cur,_short,My_test);

        place left = new place(now_place.row,now_place.col-1);
        prev_place = now_place;
        Walk(maze,start,left,prev_place,cur,_short,My_test);
        My_test.StackDelete(cur);
    }
}


//-------------------------------------------------------

class place{//描述点的位置
    int row;
    int col;
    place(int row, int col){
        this.row = row;
        this.col = col;
    }
    place(){}
}

public class Main{
    public static void main(String[] args){
        Maze My_Maze = new Maze();//创建栈对象
        Method Test_stack = new My_Method();//创建栈的实现对象
        StackList stackList_cur = new StackList();//创建每条路径的栈对象
        StackList stackList_short = new StackList();//创建代表最短路径的栈对象
        Test_stack.StackInit(stackList_cur);//初始化栈对象
        Test_stack.StackInit(stackList_short);//初始化栈对象
        Maze_Method New_Test = new My_Maze_Method();//初始化迷宫的实现对象
        place Enter = new place(0,1);//创建入口对象
        place Prev = new place(-1,-1);//创建前一个对象(这里的赋值主要针对入口点,我们可以直接把它赋值成特定的非法值)
        Maze maze = new Maze();//创建地图对象
        New_Test.Init(maze);//初始化地图
        New_Test.Walk(maze,Enter,Enter,Prev,stackList_cur,stackList_short,Test_stack);//实现迷宫求解的主要递归方法
        New_Test.Display(maze);//打印迷宫路径
        System.out.println("迷宫的最短路径是:");
        for(int i = 0; i<stackList_short.size;i++){//打印最短路径
            System.out.println("("+stackList_short.data[i].row+","+stackList_short.data[i].col+")");
        }
    }
}
    嗯,如果有不合理的地方还请大神指教。

猜你喜欢

转载自blog.csdn.net/qq_38449518/article/details/79969024
今日推荐