首页 > 编程语言 >P1746 离开中山路 JAVA题解 (广搜和双向广搜优化)

P1746 离开中山路 JAVA题解 (广搜和双向广搜优化)

时间:2024-12-02 15:04:29浏览次数:8  
标签:JAVA int 题解 P1746 queue y1 static Pair new

题目背景

《爱与愁的故事第三弹·shopping》最终章。

题目描述

爱与愁大神买完东西后,打算坐车离开中山路。现在爱与愁大神在 x1,y1x1​,y1​ 处,车站在 x2,y2x2​,y2​ 处。现在给出一个 n×n(n≤1000)n×n(n≤1000) 的地图,00 表示马路,11 表示店铺(不能从店铺穿过),爱与愁大神只能垂直或水平着在马路上行进。爱与愁大神为了节省时间,他要求最短到达目的地距离(每两个相邻坐标间距离为 11)。你能帮他解决吗?

输入格式

第 11 行包含一个数 nn。

第 22 行到第 n+1n+1 行:整个地图描述(00 表示马路,11 表示店铺,注意两个数之间没有空格)。

第 n+2n+2 行:四个数 x1,y1,x2,y2x1​,y1​,x2​,y2​。

输出格式

只有 11 行,即最短到达目的地距离。

输入输出样例

输入 #1复制

3
001
101
100
1 1 3 3

输出 #1复制

4

说明/提示

对于 20%20% 数据,满足 1≤n≤1001≤n≤100。

对于 100%100% 数据,满足 1≤n≤10001≤n≤1000。

单向广搜

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

public class Main {
    static int[][] div = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    static int n;
    static int[][] arr, span;

    static class Pair {
        int x;
        int y;

        Pair(int a, int b) {
            x = a;
            y = b;
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        arr = new int[n+1][n+1];
        span = new int[n+1][n+1];
        sc.nextLine();
        for (int i = 1; i <= n; i++) {
            String s = sc.nextLine();
            for (int j = 1; j <= n; j++) {
                arr[i][j] = s.charAt(j-1) - '0';
                span[i][j] = -1;
            }
        }
        int x1 = sc.nextInt(), y1 = sc.nextInt(), x2 = sc.nextInt(), y2 = sc.nextInt();
        System.out.println(bfs(x1 , y1 , x2 , y2 ));
    }

    private static int bfs(int x1, int y1, int x2, int y2) {
        Queue<Pair> queue = new LinkedList<>();
        queue.add(new Pair(x1, y1));
        span[x1][y1] = 0;
        while (!queue.isEmpty()) {
            Pair poll = queue.poll();
            for (int i = 0; i < div.length; i++) {
                int xx = div[i][0] + poll.x;
                int yy = div[i][1] + poll.y;
                if (xx >= 1 && xx <= n && yy >= 1 && yy <= n && arr[xx][yy] == 0 && span[xx][yy] == -1) {
                    span[xx][yy]=span[poll.x][poll.y]+1;
                    if (xx==x2&&yy==y2) {
                        return span[xx][yy];
                    }
                    queue.add(new Pair(xx,yy));
                }
            }
        }
        return span[x2][y2];
    }
}

双向广搜

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
    static int[][] div = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    static int n;
    static int[][] arr, span;

    static class Pair {
        int x;
        int y;

        Pair(int a, int b) {
            x = a;
            y = b;
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        arr = new int[n+1][n+1];
        span = new int[n+1][n+1];
        sc.nextLine();
        for (int i = 1; i <= n; i++) {
            String s = sc.nextLine();
            for (int j = 1; j <= n; j++) {
                arr[i][j] = s.charAt(j-1) - '0';
                span[i][j] = -1;
            }
        }
        int x1 = sc.nextInt(), y1 = sc.nextInt(), x2 = sc.nextInt(), y2 = sc.nextInt();
        System.out.println(bfs(x1 , y1 , x2 , y2 ));
    }

    private static int bfs(int x1, int y1, int x2, int y2) {
        Queue<Pair> queue = new LinkedList<>();
        queue.add(new Pair(x1, y1));
        queue.add(new Pair(x2,y2));
        span[x1][y1] = 0;
        arr[x1][y1]=2;
        span[x2][y2]=0;
        arr[x2][y2]=3;
        while (!queue.isEmpty()) {
            Pair poll = queue.poll();
            for (int i = 0; i < div.length; i++) {
                int xx = div[i][0] + poll.x;
                int yy = div[i][1] + poll.y;
                if (xx >= 1 && xx <= n && yy >= 1 && yy <= n &&arr[xx][yy]+arr[poll.x][poll.y]==5) {
                    return span[xx][yy]+span[poll.x][poll.y]+1;
                }
                if (xx >= 1 && xx <= n && yy >= 1 && yy <= n && arr[xx][yy] == 0) {
                    span[xx][yy]=span[poll.x][poll.y]+1;
                    arr[xx][yy]=arr[poll.x][poll.y];
                    queue.add(new Pair(xx,yy));
                }
            }
        }
        return -1;
    }
}

两个的运行结果,对比一下虽然没快多少,但双向广搜还是要快一些

标签:JAVA,int,题解,P1746,queue,y1,static,Pair,new
From: https://blog.csdn.net/weixin_67289517/article/details/144187343

相关文章

  • 1100 道 Java 面试题(含答案)
    2025年马上快到了,发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全~这套互联网Java工程师面试题包括了:MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java面试、Spring、微服务、Linux、Springboot、SpringCloud、MQ、Kafka面试专题......
  • 基于Java+SpringBoot+Vue的前后端分离的口腔管家平台
    基于Java+SpringBoot+Vue的前后端分离的口腔管家平台前言✌全网粉丝20W+,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • 基于Java+SpringBoot+Vue的前后端分离的垃圾分类网站
    基于Java+SpringBoot+Vue的前后端分离的垃圾分类网站前言✌全网粉丝20W+,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • Java中的类变量
    在Java中,类变量是指使用static修饰的变量。它是属于类本身的,而不是某个对象的,因此所有类的实例共享同一个类变量。类变量的特点属于类本身类变量在内存中只存在一份,所有该类的实例共享同一个变量。声明方式使用static关键字声明。生命周期类变量在类加载时被初......
  • Java中的静态方法
    在Java中,静态方法是使用static关键字修饰的方法。它属于类本身,而不是类的实例。静态方法可以在不创建类的对象的情况下直接调用,因此常用于工具类、工厂方法或全局逻辑的实现。静态方法的特点属于类本身静态方法是类级别的,直接与类相关,而不是与某个实例相关。不依赖于实......
  • 基于Java的电子产品租借管理系统的设计与实现-毕业设计源码39512
    基于Java的电子产品租借管理系统的设计与实现摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对电子产品租借管理系统的设计与实现等问题,对电......
  • 基于Java web的考勤系统设计与实现-计算机毕业设计源码42117
    基于Javaweb的考勤系统设计与实现摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,考勤系统的研究旨在设计和开发一种自动化的考勤管理系统,以提高组织内部的考勤效率、减少人力成本,并确保员工的出勤数据......
  • Java高级面试题大总结!(面试必备)
    1.为什么等待和通知是在Object类而不是Thread中声明的?一个棘手的 Java 问题,如果 Java编程语言不是你设计的,你怎么能回答这个问题呢。Java编程的常识和深入了解有助于回答这种棘手的 Java 核心方面的面试问题。为什么wait,notify和notifyAll是在Object类中定义......
  • 2025高频java面试题(八股文)
    1一个Java文件里可以有多个类吗(不含内部类)?一个java文件里可以有多个类,但最多只能有一个被public修饰的类;如果这个java文件中包含public修饰的类,则这个类的名称必须和java文件名一致。1.2 说一说你对Java访问权限的了解?同一个类同一个包不同包的子类不同包的非子类priva......
  • 最新Java八股文大全面试汇总!
    1.Java基础1.1说说JVM内存模型JVM由三部分组成:类加载子系统、执行引擎、运行时数据区。类加载子系统:可以根据指定的全限定名来载入类或接口。执行引擎:负责执行那些被载入类的方法中的指令。运行时数据区:包含五部分的内容:栈、堆、本地方法栈(为Native方法提供服务)、方法区(元......