数据结构与算法基础篇--迷宫问题处理

力扣:499, 505

能通过的为0,不能通过的为1,找最短路径长

直接上基本迷宫解法

package com.rojer;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class Labyrinth {

    public static int labyrinth(int [][] arrayElement, int[] start, int[] end) {
        // 判断起点与终点是否一致
        if (start == end) {
            return 0;
        }
        int m = arrayElement.length; // 获取x长
        int n = arrayElement[0].length; // 获取y长

        // 创建遍历点Queue
        Queue<int[]> queue = new LinkedList<>();
        // 将起点加入队列
        queue.add(new int[]{start[0], start[1]});

        // 创建距离二维数组图
        int[][] dp = new int[m][n];
        // 将距离图赋予最大值
        for (int [] a : dp) {
            Arrays.fill(a, Integer.MAX_VALUE);
        }
        // 将起点置为0
        dp[start[0]][start[1]] = 0;

        // 创建方位二维图
        int [][] ac ={{0,1}, {0,-1}, {1,0}, {-1,0}};

        // 遍历所有节点
        while (!queue.isEmpty()) {
            int[] poll = queue.poll();
            // 初始方位
            int x = poll[0], y = poll[1];
            int distance = dp[x][y];
            for (int[] a : ac) {
                // 创建临时变量用于后续循环遍历
                int dx = x;
                int dy = y;
                // 满足条件时进入循环
                while (dx + a[0] < m && dx + a[0] >= 0 && dy + a[1] < n && dy + a[1] >= 0
                        && arrayElement[dx + a[0]][dy + a[1]] == 0) {
                    dx += a[0];
                    dy += a[1];

                    // 判断当条件等于时, 取最优步长可以不用这一步
                    if (dx == end[0] && dy == end[1]) {
                        // 计算路长
                        return distance + Math.abs(dx - x) + Math.abs(dy - y);
                    }
                    // 总是取最小值
                    if (dp[dx][dy] > distance + Math.abs(dx - x) + Math.abs(dy - y)) {
                        dp[dx][dy] = distance + Math.abs(dx - x) + Math.abs(dy - y);
                        // 增加下一个遍历起点
                        queue.add(new int[]{dx, dy});
                    }
                }
            }
        }
        return dp[end[0]][end[1]] == Integer.MAX_VALUE ? -1 : dp[end[0]][end[1]];
    }

    public static void main(String[] args) {
        int [][] arrayElement = {{0,0,1,0},{1,1,0,0},{0,0,0,1},{0,0,1,0},{0,0,0,1}};
        int[] start = {0,3};
        int[] end = {4,0};
        System.out.println(labyrinth(arrayElement, start, end)); // 应输出7
        int[] start1 = {0,3};
        int[] end1 = {1,2};
        System.out.println(labyrinth(arrayElement, start1, end1)); // 应输出2
        int[] start2 = {0,3};
        int[] end2 = {2,3};
        System.out.println(labyrinth(arrayElement, start2, end2)); // 应输出-1
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值