JAVA-指定入口和出口的迷宫代码

有个多年未见的老同学突然找我,

我还以为是找我借钱,菊花一紧。

还好是叫我帮他写个迷宫程序:

说是什么语言都行,就用java实现了一版,

比较粗糙,还有可以优化的地方。但是他也不懂,写的好不好的应该看不出来,保证能用就行了,代码如下:

package test;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * 迷宫问题
 */
public class Dream {

	private static List<String> PATH = new ArrayList<>();//路径

    private static int[][] DREAM ={
    	//列 0,1,2,3,4,5,6,7,8,9,10,11
    		{1,1,1,1,1,1,1,1,1,1,1,1},	//0行
            {1,0,0,0,0,0,0,1,0,0,0,1},	//1行
            {1,0,1,0,1,0,0,0,0,1,0,1},	//2行
            {1,0,0,0,0,0,1,1,0,0,0,1},	//3行
            {1,0,0,1,0,0,0,0,0,1,0,1},	//4行
            {1,1,0,1,0,1,0,1,1,0,0,1},	//5行
            {1,0,0,0,0,0,1,0,0,0,1,1},	//6行
            {1,0,1,0,1,0,0,1,0,1,0,0},	//7行
            {1,0,0,0,0,1,0,1,0,0,0,1},	//8行
            {1,1,1,1,1,1,1,1,1,1,1,1},	//9行
    };


    public static void main(String[] args) {
    	// 入口位置
    	Node start = new Node(1,1,null);
    	// 出口位置
		Node end = new Node(7,11,null);
    	// 最后一个的位置,用来防止越界
		Node last = new Node(9,11,null);

        Queue<Node> queue=new LinkedList<>();
        queue.add(start);
        Node result = null;
        while (!queue.isEmpty()){
            Node temp=queue.poll();
            //将相邻的可达点加入队列
            do {
                temp=findNext(temp,last);
                if (temp!=null){
                	queue.add(temp);
					if (temp.x == end.x && temp.y == end.y){//找到了
						result = temp;
					}
                }
            }while (temp!=null);

        }
        if(result == null){
        	System.out.println("图形有误,没有出口");
		}else{
        	System.out.println("路径如下:");
        	print(result);
        	int begin = PATH.lastIndexOf(getPath(start));
        	PATH = PATH.subList(begin, PATH.size());
			for(String location : PATH){
				System.out.println(location);
			}
			System.out.println("结束");
		}


    }

    /**
     * 递归输出
     */
    private static void print(Node node) {
        if (node.pre==null){
        	PATH.add(getPath(node));
        }else {
            print(node.pre);
            PATH.add(getPath(node));
        }
    }

	private static String getPath(Node node) {
		return "(" + node.x + "行," + node.y + "列)";
	}

	/**
     * 往四个方向寻找一个可以到达的点
     */
    private static Node findNext(Node node,Node last){
		if(node.x >= last.x || node.y >= last.y){//越界了
			return null;
		}
        if (DREAM[node.x+1][node.y]==0){
            //标记已经到达过
            DREAM[node.x+1][node.y]=2;
            return new Node(node.x+1, node.y, node);
        }
        if (DREAM[node.x-1][node.y]==0){
            DREAM[node.x-1][node.y]=2;
            return new Node(node.x-1, node.y, node);
        }
        if (DREAM[node.x][node.y+1]==0){
            DREAM[node.x][node.y+1]=2;
            return new Node(node.x, node.y+1, node);
        }
        if (DREAM[node.x][node.y-1]==0){
            DREAM[node.x][node.y-1]=2;
            return new Node(node.x, node.y-1, node);
        }
        return null;
    }

    static class Node{
        int x;
        int y;
        Node pre;

        Node(int x, int y, Node pre) {
            this.x = x;
            this.y = y;
            this.pre = pre;
        }
    }

}

运行后结果如下:

 

 

要改动的话,只要改一下如下配置,其他地方不用改:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学编程的司马光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值