【短学期算法作业】用Java写迷宫问题(栈)

简介: 【短学期算法作业】用Java写迷宫问题(栈)

题目介绍

迷宫问题(栈)

有一个迷宫地图,有一些可达的位置,也有一些不可达的位置(障碍、墙壁、边界)。从当前位置到下一个位置只能通过向上(或者向右、或者向下、或者向左)走一步来实现,从起点出发,如何找到一条到达终点的通路。

用二维矩阵来模拟迷宫地图,1代表该位置不可达,0代表该位置可达。每走过一个位置就将地图的对应位置标记,以免重复。找到通路后打印每一步的坐标,最终到达终点位置。

Input


题目思路

利用广度搜索法,遍历能找到的结点并标记,然后用另外一个数组来记录走过的路径。


具体代码

package com.dreamchaser;
import java.util.LinkedList;
import java.util.Queue;
/**
 * 迷宫问题(栈)
 *
 */
public class test1 {
    int m=8;
    int n=8;
    static int[][] maze={{1,1,1,1,1,1,1,1,1,1},
            {1,0,0,1,0,0,0,1,0,1},
            {1,0,0,1,0,0,0,1,0,1},
            {1,0,0,0,0,1,1,0,0,1},
            {1,0,1,1,1,0,0,0,0,1},
            {1,0,0,0,1,0,0,0,0,1},
            {1,0,1,0,0,0,1,0,0,1},
            {1,0,1,1,1,0,1,1,0,1},
            {1,1,0,0,0,0,0,0,0,1},
            {1,1,1,1,1,1,1,1,1,1}};
    public static void main(String[] args) {
        Queue<Node> queue=new LinkedList<Node>();
        queue.add(new Node(1,1,null));
        while (!queue.isEmpty()){
            Node node=queue.poll();
            Node temp;
            //将相邻的可达点加入队列
            do {
                temp=find(node);
                if (temp!=null){
                    queue.add(temp);
                }
            }while (temp!=null);
            if (node.x==8&&node.y==8){
                print(node);
            }
        }
    }
    /**
     * 递归输出
     * @param node
     */
    private static void print(Node node) {
        if (node.pre==null){
            System.out.println("("+node.x+","+node.y+")");
        }else {
            print(node.pre);
            System.out.println("("+node.x+","+node.y+")");
        }
    }
    /**
     * 往四个方向寻找一个可以到达的点
     */
    private static Node find(Node node){
        if (maze[node.x+1][node.y]==0){
            //标记已经到达过
            maze[node.x+1][node.y]=2;
            return new Node(node.x+1, node.y, node);
        }
        if (maze[node.x-1][node.y]==0){
            maze[node.x-1][node.y]=2;
            return new Node(node.x-1, node.y, node);
        }
        if (maze[node.x][node.y+1]==0){
            maze[node.x][node.y+1]=2;
            return new Node(node.x, node.y+1, node);
        }
        if (maze[node.x][node.y-1]==0){
            maze[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;
        public Node(int x, int y, Node pre) {
            this.x = x;
            this.y = y;
            this.pre = pre;
        }
    }
}


运行截图

q1.png


相关文章
|
1天前
|
存储 算法 安全
Java中的DES和3DES加密算法详解
Java中的DES和3DES加密算法详解
|
1天前
|
Java BI C#
技术笔记:SM4加密算法实现Java和C#相互加密解密
技术笔记:SM4加密算法实现Java和C#相互加密解密
|
1天前
|
机器学习/深度学习 并行计算 搜索推荐
程序技术好文:桶排序算法及其Java实现
程序技术好文:桶排序算法及其Java实现
|
1天前
|
搜索推荐 算法 小程序
基于Java协同过滤算法的电影推荐系统设计和实现(源码+LW+调试文档+讲解等)
基于Java协同过滤算法的电影推荐系统设计和实现(源码+LW+调试文档+讲解等)
|
1天前
|
搜索推荐 算法 小程序
基于Java协同过滤算法的图书推荐系统设计和实现(源码+LW+调试文档+讲解等)
基于Java协同过滤算法的图书推荐系统设计和实现(源码+LW+调试文档+讲解等)
|
1天前
|
搜索推荐 算法 Java
Java数据结构与算法:排序算法之选择排序
Java数据结构与算法:排序算法之选择排序
|
3天前
|
Java 机器人 程序员
Java中的线程通信:wait、notify与Condition详解
Java中的线程通信:wait、notify与Condition详解
|
3天前
|
存储 安全 Java
Java中的线程安全与同步技术
Java中的线程安全与同步技术
|
1天前
|
监控 Java 调度
Java并发编程:深入理解线程池
【6月更文挑战第26天】在Java并发编程的世界中,线程池是提升应用性能、优化资源管理的关键组件。本文将深入探讨线程池的内部机制,从核心概念到实际应用,揭示如何有效利用线程池来处理并发任务,同时避免常见的陷阱和错误实践。通过实例分析,我们将了解线程池配置的策略和对性能的影响,以及如何监控和维护线程池的健康状况。
7 1
|
1天前
|
存储 缓存 Java
老程序员分享:Java并发编程:线程池的使用
老程序员分享:Java并发编程:线程池的使用