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

代码:

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("迷宫走不通");
        }
    }
}

输出之一:

迷宫图示
☆☆★☆☆☆☆★☆★
☆☆☆☆☆☆☆☆☆☆
☆★☆☆☆★☆☆★☆
☆☆★☆☆★☆★☆☆
☆☆☆★★☆★☆☆★
☆☆☆☆★☆★☆☆☆
★★☆☆☆☆☆☆★☆
☆☆☆☆☆☆☆☆☆★
☆☆★★★☆☆★★☆
☆☆★★☆☆☆☆☆☆
迷宫走得通,下图圆点为路径
⊙☆★☆☆☆☆★☆★
⊙☆☆☆☆☆☆☆☆☆
⊙★☆☆☆★☆☆★☆
⊙☆★☆☆★☆★☆☆
⊙☆☆★★☆★☆☆★
⊙⊙⊙☆★☆★☆☆☆
★★⊙☆☆☆☆☆★☆
☆☆⊙⊙⊙⊙☆☆☆★
☆☆★★★⊙☆★★☆
☆☆★★☆⊙⊙⊙⊙⊙

输出之二:

迷宫图示
☆☆☆☆★☆☆☆★☆
☆★☆★★★☆☆☆★
★☆☆☆☆☆☆☆☆☆
☆☆☆☆☆★☆☆☆☆
★☆☆☆★☆★★★★
☆☆☆☆★★☆☆★☆
★☆☆★☆☆★☆☆★
☆☆☆☆☆☆☆☆☆☆
☆☆☆★☆☆★☆★★
☆☆★★☆☆☆★☆☆
迷宫走不通
原文地址:https://www.cnblogs.com/heyang78/p/3887782.html