爪哇国新游记之二十六----迷宫寻路

简介:

代码:

复制代码
class Position{
    int x;
    int y;
    
    public Position(int x,int y){
        this.x=x;
        this.y=y;
    }
}
// 迷宫寻路
public class Maze{
    private int size;
    private int[][] matrix;// 代表迷宫的二维数组,0表示通路
    
    /**
     * 构建迷宫
     * 迷宫的左上角为入口,右下角为出口
     * @param size 二维数组的边长
     * @param percent 可通过区域占整体的比例 
     */
    public void build(int size,double percent){
        this.size=size;
        matrix=new int[size][size];
        
        for(int i=0;i<size;i++){
            for(int j=0;j<size;j++){
                double seed=Math.random();
                
                if(seed>percent){
                    matrix[i][j]=0;
                }else{
                    matrix[i][j]=1;
                }
            }
        }
        
        // 入口出口不能堵死
        matrix[0][0]=0;
        matrix[size-1][size-1]=0;
    }
    
    // 打印迷宫
    public void displayMatrix(){
        for(int i=0;i<size;i++){
            for(int j=0;j<size;j++){
                if(matrix[i][j]==0){
                    System.out.print("");// 可通过区域
                }else if(matrix[i][j]==1){
                    System.out.print("");// 不可通过区域
                }else if(matrix[i][j]==2){
                    System.out.print("⊙");// 路径
                }
            }
            
            System.out.println();
        }
    }
    
    // 寻找迷宫出路
    public boolean findPath(){
        // 暂存matrix
        int[][] arr=new int[size][size];
        for(int i=0;i<size;i++){
            for(int j=0;j<size;j++){
                arr[i][j]=matrix[i][j];
            }
        }
        
        //  用于记住路径的栈
        Stack<Position> stack=new Stack<Position>(Position.class,size*size);
        
        matrix[0][0]=1;
        Position curr=new Position(0,0);
        stack.push(curr);
        
        while(curr.x!=size-1 || curr.y!=size-1){
            Position next=getWayout(curr);
            
            if(next!=null){
                stack.push(curr);
                
                matrix[next.x][next.y]=1;
                curr=next;
            }else{
                if(stack.isEmpty()){
                    return false;
                }else{
                    curr=stack.pop();
                }
            }
        }
        
        // matrix 取回原值
        for(int i=0;i<size;i++){
            for(int j=0;j<size;j++){
                matrix[i][j]=arr[i][j];
            }
        }
        
        // 栈内容
        while(stack.isEmpty()==false){
            Position pos=stack.pop();
            
            matrix[pos.x][pos.y]=2;
        }
        
        matrix[size-1][size-1]=2;// 最终到达右下角
        
        return true;
    }
    
    // 取得临近能出去的点
    private Position getWayout(Position currPos){
        //
        if(currPos.x+1<size && matrix[currPos.x+1][currPos.y]==0){
            return new Position(currPos.x+1,currPos.y);
        }
        
        //
        if(currPos.y+1<size && matrix[currPos.x][currPos.y+1]==0){
            return new Position(currPos.x,currPos.y+1);
        }
        
        //
        if(0<currPos.x-1 && matrix[currPos.x-1][currPos.y]==0){
            return new Position(currPos.x-1,currPos.y);
        }
        
        //
        if(0<currPos.y-1 && matrix[currPos.x][currPos.y-1]==0){
            return new Position(currPos.x,currPos.y-1);
        }
        
        return null;
    }
    
    public static void main(String[] args){
        Maze m=new Maze();
        m.build(10, 0.3);
        System.out.println("迷宫图示");
        m.displayMatrix();
        
        boolean f=m.findPath();
        if(f){
            System.out.println("迷宫走得通,下图圆点为路径");
            m.displayMatrix();
        }else{
            System.out.println("迷宫走不通");
        }
    }
}
复制代码

输出之一:

复制代码
迷宫图示










迷宫走得通,下图圆点为路径
⊙
⊙
⊙
⊙
⊙
⊙⊙⊙
⊙
⊙⊙⊙⊙
⊙
⊙⊙⊙⊙⊙
复制代码

输出之二:

复制代码
迷宫图示










迷宫走不通
复制代码

 











本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/xiandedanteng/p/3887782.html,如需转载请自行联系原作者

相关文章
|
5月前
一文搞懂:【bzoj】3436小K的农场
一文搞懂:【bzoj】3436小K的农场
23 0
|
定位技术
国庆七天乐,要猛! ——经典迷宫问题
国庆七天乐,要猛! ——经典迷宫问题
83 0
|
算法
《C游记》 番外篇(壹)二分查找显神威 猜数游戏趣味生
《C游记》 番外篇(壹)二分查找显神威 猜数游戏趣味生
134 0
《C游记》 番外篇(壹)二分查找显神威 猜数游戏趣味生
|
算法
​LeetCode刷题实战417:太平洋大西洋水流问题
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
142 0
​LeetCode刷题实战417:太平洋大西洋水流问题
|
算法
算法给小码农链式二叉树-----一根草可斩星辰
链式二叉树 我们需要明白一点,就是普通的二叉树增删查改没有什么价值,因为普通二叉树用来存数据复杂且不方便
93 0
算法给小码农链式二叉树-----一根草可斩星辰
洛谷P1047-校门外的树(模拟)
洛谷P1047-校门外的树(模拟)
|
数据采集 传感器 人工智能
拆车、炸机、毁魔方,这个疯狂的算法竞赛少年目的是这样的…
拆车、炸机、毁魔方,这个疯狂的算法竞赛少年目的是这样的…
拆车、炸机、毁魔方,这个疯狂的算法竞赛少年目的是这样的…
下一篇
无影云桌面