小言_互联网的博客

Java迷宫

312人阅读  评论(0)

今天我们用简单的函数调用实现一个迷宫,具体操作如下:

迷宫的功能描述

1.提示“请输入迷宫的行列数:5 5”

2.提示“请输入迷宫的路径信息(0是可以行走,1是不能行走):”
0 0 1 1 1
1 0 0 0 1
1 0 1 1 1
1 0 1 1 1
1 0 0 0 0
搜索迷宫路径…
3.若不存在路径则打印“迷宫不存在有效路径”
4. 若存在路径则再次打印迷宫,把是路径的地方用 * 打印出
* * 1 1 1
1 * 0 0 1
1 * 1 1 1
1 * 1 1 1
1 * * * *

迷宫功能分析
0 0 1 1 1
1 0 0 0 1
1 0 1 1 1
1 0 1 1 1
1 0 0 0 0

首先用在主函数中创建一个迷宫对象,通过二维数组生成迷宫,定义迷宫的行列数和迷宫信息!

public class Main {
    public static void main(String[] args) {
        Scanner in =new Scanner(System.in);
        System.out.print("请输入迷宫的行列数:");
        int row = in.nextInt();
        int col = in.nextInt();

        //用row 和 col生成迷宫对象
        Maze maze = new Maze(row,col);

        System.out.println("请输入迷宫的路径信息:");
        for (int i = 0; i < row;++i) {
            for (int j = 0; j < col; ++j) {
                int data = in.nextInt();
                maze.creatMazeNode(data,i,j);
            }
        }
        //设置迷宫每一个节点的四个方向的行走状态
        maze.setMazeNodeState();
        //开始寻找迷宫路径
        maze.findMazePath();
        //输出迷宫路径结果
        maze.showMazePath();
    }
}

解决这个问题需要创建一个栈,将入口处节点放入栈顶,规定在每一个节点处寻找迷宫路径按照右下左上的方式寻找,依次走过每一个节点,将可行走路径的节点放入栈中,最终将栈中元素输出,并打印出迷宫状态!

package 迷宫;
import java.util.Arrays;

/**
 * 顺序栈
 * 寻找迷宫路径需要用到的栈结构
 */
public class Stack {
    //存储节点类型
    private Node[] array;
    //栈顶的位置
    private int top;

    //构造,push,pop,top,full,empty
    public Stack(){//定义顺序栈的长度
        this.array = new Node[10];
        this.top = 0;
    }
    public void push (Node node){//构造节点入栈
        if (this.top==this.array.length){//判断数组元素是否溢出,若溢出则对其进行扩容
            this.array=Arrays.copyOf(this.array,this.array.length*2);
        }
        this.array[this.top++]=node;
    }
    public Node pop(){//将不符合条件节点进行出栈操作
        this.top--;
        Node node=this.array[top];
        return node;
    }
    public Node top(){
        return this.array[top-1];
    }//构造栈顶
    public boolean empty(){
        return this.top == 0;
    }//判断其是否为空
    public boolean full(){
        return this.array.length == this.top;
    }//判断栈满

}

因为迷宫的生成是一个二维数组,所以用一个Node函数来记录迷宫的节点类型和元素值,并且记录节点四个方向的行走状态。

package 迷宫;

/**
 * 迷宫节点的类型
 */
public class Node {
    int data;//节点值
    int x;//节点的x坐标
    int y;//节点的y坐标
    //记录节点四个方向的行走状态
    boolean right;
    boolean down;
    boolean left;
    boolean up;

    public Node(int data, int i, int j) {
        this.x=i;
        this.y=j;
        this.data=data;
    }
}

最终构造函数,完成迷宫的相应功能!

1.四个方向的行走状态代码实现

/**
     *
     * @param data
     * @param i
     * @param j
     */
    public void creatMazeNode(int data, int i, int j) {
        this.maze[i][j]=new Node(data,i,j);
    }
    //设置迷宫每一个节点的四个方向的行走状态
    public void setMazeNodeState() {
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (this.maze[i][j].data==1){
                    continue;
                }
                //调整节点的右方向
                if (j < col-1 && this.maze[i][j+1].data == 0){
                    this.maze[i][j].right=true;
                }
                //调整节点的下方向
                if (i<row-1 && this.maze[i+1][j].data == 0){
                    this.maze[i][j].down=true;
                }
                //调整节点的左方向
                if (j>0 && this.maze[i][j-1].data == 0){
                    this.maze[i][j].left=true;
                }
                //调整节点的上方向
                if (i>0 && this.maze[i-1][j].data == 0){
                    this.maze[i][j].up=true;
                }
            }
        }
    }

2.寻找迷宫路径代码实现

public void findMazePath() {
        if (maze[0][0].data == 1 || maze[row-1][col-1].data ==1) {//若起点和终点处节点元素为1,则返回值
            return;
        }
        //把入口节点入栈
        this.stack.push(this.maze[0][0]);
        while (!this.stack.empty()){//判断顺序栈是否为空
            //获取栈顶节点
            Node node=this.stack.top();
            //栈顶节点是出口节点,迷宫路径搜索完成了
            if (node.x ==row-1 && node.y ==col-1) {
                return;
            }
            if (node.right){//右方向可以走
                this.maze[node.x][node.y].right=false;
                this.maze[node.x][node.y+1].left=false;
                this.stack.push(this.maze[node.x][node.y+1]);
                continue;
            }
            if (node.down){//下方向可以走
                this.maze[node.x][node.y].down=false;
                this.maze[node.x+1][node.y].up=false;
                this.stack.push(this.maze[node.x+1][node.y]);
                continue;
            }
            if (node.left){//左方向可以走
                this.maze[node.x][node.y].left=false;
                this.maze[node.x][node.y-1].right=false;
                this.stack.push(this.maze[node.x][node.y-1]);
                continue;
            }
            if (node.up){//上方向可以走
                this.maze[node.x][node.y].up=false;
                this.maze[node.x-1][node.y].down=false;
                this.stack.push(this.maze[node.x-1][node.y]);
                continue;
            }
            this.stack.pop();
        }
    }

3.显示迷宫路径代码实现

 public void showMazePath() {
        if (this.stack.empty()){
            System.out.println("迷宫不存在有效路径");
        }else {
            while (!this.stack.empty()){
                Node node = this.stack.top();
                this.maze[node.x][node.y].data = '*';
                this.stack.pop();
            }
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < col; j++) {
                    if (this.maze[i][j].data=='*'){
                        System.out.print('*' + " ");
                    }else {
                        System.out.print(this.maze[i][j].data + " ");
                    }
                }
                System.out.println();
            }
        }
    }
}```


转载:https://blog.csdn.net/ccuaman/article/details/102489677
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场