首页 > 编程语言 >P2658 汽车拉力比赛 JAVA题解

P2658 汽车拉力比赛 JAVA题解

时间:2024-11-30 14:29:05浏览次数:11  
标签:JAVA java int 题解 queue P2658 static import new

package 篮桥杯.d;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
    //自定义的输入类,比普通Scanner快两倍多
    static class Scanner{
        StreamTokenizer streamTokenizer=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        public int nextInt() throws IOException {
            streamTokenizer.nextToken();
            return (int) streamTokenizer.nval;
        }
    }
    //自定义在广度优先搜索中纪录位置的类
    static class Pair{
        int x;
        int y;
        Pair(int a,int b){
            x=a;
            y=b;
        }
    }
    static int n,m,bytex,bytey,count;//bytex,bytey是纪录广度优先搜索中开始搜索的位置 count是记录路标的个数
    static int[][] arr,div={{-1,0},{1,0},{0,1},{0,-1}};//arr是高度div是方位
    static byte[][] bytes;//纪录路标的位置
    static boolean[][] span;//纪录走过的位置
    static Queue<Pair> queue=new LinkedList<>();//广搜所使用的队列
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner();
        n=sc.nextInt();
        m=sc.nextInt();
        arr=new int[n+1][m+1];
        bytes=new byte[n+1][m+1];
        span=new boolean[n+1][m+1];
        for (int i = 1; i <=n ; i++) {//输入高度
            for (int j = 1; j <=m ; j++) {
                arr[i][j]=sc.nextInt();
            }
        }
        for (int i = 1; i <=n ; i++) {//输入路标
            for (int j = 1; j <=m ; j++) {
                bytes[i][j]= (byte) sc.nextInt();
                if (bytes[i][j]==1){//纪录路标位置,虽然会覆盖但只要是路标从哪搜都可以
                    bytex=i;
                    bytey=j;
                    count++;//纪录路标个数
                }
            }
        }
        //用二分的模板可以从b站上搜到
        int l=-1,r=1000000010;
        while (l+1!=r){
            int m=l+r>>>1;
            if (bsf(m)){
                r=m;
            }else {
                l=m;
            }
        }
        System.out.println(r);
    }

    private static boolean bsf(int k) {
        int c=1;
        queue.clear();
        span=new boolean[n+1][m+1];
        queue.add(new Pair(bytex,bytey));
        span[bytex][bytey]=true;
        while (!queue.isEmpty()){
            Pair poll = queue.poll();
            for (int i = 0; i < div.length; i++) {
                int xx=poll.x+div[i][0];
                int yy=poll.y+div[i][1];
                if (xx>=1&&xx<=n&&yy>=1&&yy<=m&&!span[xx][yy]&&Math.abs(arr[poll.x][poll.y]-arr[xx][yy])<=k){
                    if (bytes[xx][yy]==1){
                        c++;
                        if (c==count){
                            return true;
                        }
                    }
                    span[xx][yy]=true;
                    queue.add(new Pair(xx,yy));
                }
            }
        }
        return false;
    }
}

标签:JAVA,java,int,题解,queue,P2658,static,import,new
From: https://blog.csdn.net/weixin_67289517/article/details/144142278

相关文章

  • Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
    背景事件:近日,优衣库宣布不再使用新疆棉花,这一举措引发了广泛的社会讨论。消费者的反应和舆论的压力,让优衣库的决策迅速影响了市场和品牌形象。类似的,许多系统也面临着需要根据外部事件或状态的变化,做出即时反应的需求。在软件设计中,观察者模式(ObserverPattern)就是为了处理这种......
  • 如何让Java的线程彼此同步?
    在Java中,线程同步是一个重要的概念,用于确保多个线程在访问共享资源时能够保持数据的一致性和正确性。Java提供了多种线程同步机制,以下是具体的同步方法:一、使用synchronized关键字synchronized同步方法:即在方法声明中使用synchronized关键字。当一个线程访问某个对象的synchr......
  • USB无法识别设备?USB驱动问题解析篇
    今天我们来讲解的是USB驱动问题,连接USB无法识别模组设备,是不是驱动问题?今天就一起来聊聊如何排查解决。注意:本文涉及的内容都是基于Windows系统,且不低于Win7版本;Linux/Mac/UNIX/低版本的Windows,不在本文涉及范围之内。一、哪些模组需要安装USB驱动可根据下方分类判断自己手中的......
  • 【无标题】JAVA策略模式代码例子
    在Java中,您可以使用面向对象编程中的继承和多态性来实现您的需求。首先,我们定义一个`Good`类,该类包含满减策略和打折策略。然后,我们可以让`Shoe`类和`Cloth`类继承自`Good`类。为了实现不同的折扣或满减策略,可以考虑使用策略模式。 下面是一个简单的实现示例: ###1.定义......
  • C# mvc +axios + web api + javascript
    2024年,是Insus.NET生命中转折的一年,许久没有更新博客了。许多网友在通讯或邮件私聊,希望在博客上更新内容,分享一些技能与通用的博文。 回归正题,在C#mvc使用javascriptaxios访问webapi。在mssqlserver创建数据表 存储过程... C#MVC程序与数据库交互,创建entity:上......
  • Atcoder Beginner Contest 330 题解
    前言过于水的一场。ACountingPasses题面给出一个长度为\(n\)的序列\(a\),求出\(a\)之中大于等于\(l\)的数个个数。\(1\len\le100,1\lea_i\le1000,1\lel\le1000\)。制約入力は全て整数$1\\le\N\\le\100$$1\\le\L\\le\1000$$0\\le\A_i\\le......
  • 婚纱摄影管理系统|Java|SSM|VUE| 前后端分离
    【重要1⃣️】前后端源码+万字文档+部署文档【重要2⃣️】正版源码有问题包售后【重要3⃣️】虚拟可复制品不支持退换货【重要3⃣️】虚拟可复制品不支持退换货【重要3⃣️】虚拟可复制品不支持退换货            【包含内容】【一】项目提供非常完整的源......
  • JavaEE进阶-----mybatis操作数据库(新手教程)
    文章目录1.创建项目2.mysql相关操作3.安装插件4.工程创建4.1Bean文件夹4.2Dao文件夹4.3xml文件内容解读4.4配置文件4.5测试文件1.创建项目我们创建项目的时候需要注意下面的这个内容:1)maven项目;2)选择配置:我们之前使用的这个lombok和这个web还是要继续选择的;与之前......
  • 学习javascript基础这一篇就够了(2024最新版)
    目录前言什么是JavaScript?BOM-浏览器对象模型DOM-文档对象模型JavaScript与Java的关系JavaScript与ECMAScript的关系JavaScript能做什么?前端领域后端领域APP桌面应用图形/游戏嵌入式与IOT开发为什么要学JavaScript?学习JavaScript所需要的的环境与设备......
  • 基于Java+SSM+HTML5汽车租赁系统(源码+LW+调试文档+讲解等)/汽车租赁/租赁系统/汽车出
    博主介绍......