利用BFS解决每个零售店到仓库最短距离之和问题

1、题目

矩阵中有3种类型:0仓库,-1障碍,1零售店。现在每个零售店要去距离它最近的仓库取货物,请计算出所有零售店到最近仓库距离之和,假设矩阵中每个单元格之间距离为1。如果遇到障碍物,则表示无法通过。可以在单元格上下左右移动。
注意
无法到达仓库的零售店不参与计算
没有零售店或者没有仓库,则返回0

2、用例

第一行输入3 3代表3×3矩阵
第二行输入矩阵值
第三行输出最短距离和
3 3
1 -1 0
0 1 1
1 -1 1
结果为6
在这里插入图片描述

3、算法

BFS

public class BFS {// 0仓库,-1障碍,1零售店// 无法到达仓库的零售店不参与计算// 没有零售店或者没有仓库,则返回0public static void main(String[] args) {Scanner cin = new Scanner(System.in, StandardCharsets.UTF_8.name());int rows = cin.nextInt();int cols = cin.nextInt();int[][] grids = new int[rows][cols];for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {grids[i][j] = cin.nextInt();}}cin.close();System.out.println(nearestWareHouse(grids));}private static int nearestWareHouse(int[][] grid) {int rows = grid.length;int cols = grid[0].length;// 仓库节点坐标Queue<int[]> visitQueue = new LinkedList<>();// 遍历grid,把所有仓库节点坐标放入bfs队列for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (grid[i][j] == 0) {// 如果是仓库节点,入队,设置visited[i][j] = truevisitQueue.add(new int[]{i, j});}}}// 初始化步长为1,此时队列中为仓库,以仓库为中心,以1为步长,向四周扩散// 将已遍历的节点设置为-1int step = 1;int result = 0;while (!visitQueue.isEmpty()) {int qcount = visitQueue.size();for (int i = 0; i < qcount; i++) {// 出队列,向该节点四周扩散// poll从队列中移除并返回头部元素int[] temp = visitQueue.poll();int x = temp[0];int y = temp[1];// 右边if (x + 1 < rows && grid[x + 1][y]==1) {result += step;grid[x + 1][y] = -1;visitQueue.add(new int[]{x + 1, y});}// 左边if (x - 1 >= 0 && grid[x - 1][y]==1) {result += step;grid[x - 1][y] = -1;visitQueue.add(new int[]{x - 1, y});}// 上面if (y - 1 >= 0 && grid[x][y - 1]==1) {result += step;grid[x][y - 1] = -1;visitQueue.add(new int[]{x, y - 1});}// 下面if (y + 1 < cols && grid[x][y + 1]==1) {result += step;grid[x][y + 1] = -1;visitQueue.add(new int[]{x, y + 1});}}step++;}return result;}
}

BFS2

static class Point {int x;int y;int step;public Point(int x, int y, int step) {this.x = x;this.y = y;this.step = step;}}private static int nearestWareHouse(int[][] grid) {int result = 0;int rows = grid.length;int cols = grid[0].length;Queue<Point> queue = new LinkedList<>();// 遍历grid,把所有仓库节点坐标放入bfs队列for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (grid[i][j] == 0) {// 如果是仓库节点,入队queue.add(new Point(i, j, 0));}}}while (!queue.isEmpty()) {Point point = queue.poll();int x = point.x;int y = point.y;// 左if (x != 0 && grid[x - 1][y] == 1) {queue.add(new Point(x - 1, y, point.step + 1));grid[x - 1][y] = -1;}// 右if (x != rows - 1 && grid[x + 1][y] == 1) {queue.add(new Point(x + 1, y, point.step + 1));grid[x + 1][y] = -1;}// 上if (y != 0 && grid[x][y - 1] == 1) {queue.add(new Point(x + 1, y, point.step + 1));grid[x + 1][y] = -1;}// 下if (y != cols - 1 && grid[x][y + 1] == 1) {queue.add(new Point(x, y + 1, point.step + 1));grid[x][y + 1] = -1;}result += point.step;}return result;}

BFS3

private static int nearestWareHouse(int[][] grid) {int rows = grid.length;int cols = grid[0].length;// 仓库节点坐标Queue<int[]> visitQueue = new LinkedList<>();// 记录已访问和未访问标记boolean[][] visited = new boolean[rows][cols];// 遍历grid,把所有仓库节点坐标放入bfs队列for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (grid[i][j] == 0) {// 如果是仓库节点,入队,设置visited[i][j] = true,设置未访问过visitQueue.add(new int[]{i, j});visited[i][j] = false;} else if (grid[i][j] == -1) {// 障碍物,设置未访问过visited[i][j] = false;} else {// 仓库,设置已访问过visited[i][j] = true;}}}// 初始化步长为1,此时队列中为仓库,以仓库为中心,以1为步长,向四周扩散// 将已遍历的节点设置为-1int step = 1;int result = 0;while (!visitQueue.isEmpty()) {int qcount = visitQueue.size();for (int i = 0; i < qcount; i++) {// 出队列,向该节点四周扩散// poll从队列中移除并返回头部元素int[] temp = visitQueue.poll();int x = temp[0];int y = temp[1];// 右边if (x + 1 < rows && visited[x + 1][y]) {result += step;visited[x + 1][y] = false;visitQueue.add(new int[]{x + 1, y});}// 左边if (x - 1 >= 0 && visited[x - 1][y]) {result += step;visited[x - 1][y] = false;visitQueue.add(new int[]{x - 1, y});}// 上面if (y - 1 >= 0 && visited[x][y - 1]) {result += step;visited[x][y - 1] = false;visitQueue.add(new int[]{x, y - 1});}// 下面if (y + 1 < cols && visited[x][y + 1]) {result += step;visited[x][y + 1] = false;visitQueue.add(new int[]{x, y + 1});}}step++;}return result;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图神经网络实战(15)——SEAL链接预测算法

图神经网络实战&#xff08;15&#xff09;——SEAL链接预测算法 0. 前言1. SEAL 框架1.1 基本原理1.2 算法流程 2. 实现 SEAL 框架2.1 数据预处理2.2 模型构建与训练 小结系列链接 0. 前言 我们已经学习了基于节点嵌入的链接预测算法&#xff0c;这种方法通过学习相关的节点嵌…

2024年上半年软件设计师上午真题及答案解析

1.在计算机网络协议五层体系结构中&#xff0c;( B )工作在数据链路层。 A.路由器 B.以太网交换机 C.防火墙 D.集线器 网络层&#xff1a;路由器、防火墙 数据链路层&#xff1a;交换机、网桥 物理层&#xff1a;中继器、集线器 2.软件交付之后&#xff…

数据可视化期末考试(编程)

1.KNN 1.新增数据的分类 import pandas as pd # 您的原始数据字典 data { 电影名称: [电影1, 电影2, 电影3, 电影4, 电影5], 打斗镜头: [10, 5, 108, 115, 20], 接吻镜头: [110, 89, 5, 8, 200], 电影类型: [爱情片, 爱情片, 动作片, 动作片, 爱情片] } …

uni-app uni-data-picker级联选择器无法使用和清除选中的值

出现问题&#xff1a; 使用点击右边的叉号按钮无法清除已经选择的uni-data-picker值 解决办法&#xff1a; 在uni-app uni-data-picker使用中&#xff0c;要添加v-model&#xff0c;v-model在官网的示例中没有体现&#xff0c;但若不加则无法清除。 <uni-data-picker v-m…

OpenAI用GPT-4o打造癌症筛查AI助手;手机就能检测中风,准确率达 82%!中国气象局发布AI气象大模型...

AI for Science 企业动态速览—— * 皇家墨尔本大学用 AI 检测患者中风&#xff0c;准确率达 82% * OpenAI 用 GPT-4o 模型打造癌症筛查 AI 助手 * 中国气象局发布 AI 气象大模型风清、风雷、风顺 * AI 药企英矽智能&#xff1a;小分子抑制剂已完成中国 IIa 期临床试验全部患者…

GPT-5智能新纪元的曙光

在美国达特茅斯工程学院周四公布的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布&#xff0c;给出了肯定答案并表示将在一年半后发布。穆拉蒂在采访中还把GPT-4到GPT-5的飞跃描述为高中生到博士生的成长。 这一爆炸性的消息&#xff0c;震动了整体…

linux下进度条的实现

目录 一、代码一版 1.processbar.h 2.processbar.c 3.main.c 二、代码二版 1.processbar.h 2.processbar.c 3.main.c 三、改变文字颜色 一、代码一版 使用模块化编程 1.processbar.h #include<stdio.h> #define capacity 101 //常量使用宏定义 #define style…

代码随想录——买股票的最佳时机Ⅱ(Leecode122)

添加链接描述 贪心 局部最优&#xff1a;手机每天的正利润 全局最优&#xff1a;求最大利润 class Solution {public int maxProfit(int[] prices) {int res 0;for(int i 1; i < prices.length; i){res Math.max(prices[i] - prices[i - 1], 0);}return res;} }

webstorm无法识别tsconfig.json引用项目配置文件中的路径别名

问题 vite项目模板中&#xff0c;应用的ts配置内容写在tsconfig.app.json文件中&#xff0c;并在tsconfig.json通过项目引用的方式导入 {"files": [],"references": [{"path": "./tsconfig.app.json"},{"path": "./t…

2024年第十五届蓝桥杯青少组大赛8月24日开启

据蓝桥杯青少组官网显示&#xff0c;2024年第十五届蓝桥杯青少组大赛8月24日开启。 蓝桥杯青少组历届题库地址&#xff1a;http://www.6547.cn/question/cat/2 蓝桥杯青少组历届真题下载&#xff1a;http://www.6547.cn/wenku/list/10

统一视频接入平台LntonCVS视频共享交换平台智慧景区运用方案

随着夏季的到来&#xff0c;各地景区迎来了大量游客&#xff0c;而景区管理面临的挑战也愈加严峻&#xff0c;尤其是安全问题显得格外突出。 视频监控在预防各类安全事故方面发挥着重要作用&#xff0c;不论是自然景区还是人文景区&#xff0c;都潜藏着诸多安全隐患&#xff0…

排序之插入排序----直接插入排序和希尔排序(1)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 排序之插入排序----直接插入排序和希尔排序(1) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记&#xff0c;欢迎大家在评论区交流讨…

图形编辑器基于Paper.js教程04: Paper.js中的基础知识

背景 了解paper.js的基础知识&#xff0c;在往后的开发过程中会让你如履平地。 基础知识 paper.js 提供了两种编写方式&#xff0c;一种是纯粹的JavaScript编写&#xff0c;还有一种是使用官方提供的PaperScript。 区别就是在于&#xff0c;调用paper下的字对象是否需要加pa…

Windows server 由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开。

问题现象&#xff1a; 解决办法 临时远程方式1: 打开 mstsc 时带上 /admin 等参数&#xff0c;如下图所示&#xff1a; 使用“mstsc /admin /v:目标ip”来强制登录服务器&#xff0c;但只能是管理员身份。 远程方式2&#xff1a; 通过VM远程登陆系统后&#xff0c;运行输入R…

Python编程编辑器PyCharm 界面介绍

PyCharm 界面介绍 当你打开 PyCharm 后&#xff0c;会看到以下主要界面区域&#xff1a; 1&#xff09;菜单栏&#xff1a; 位于界面最顶端&#xff0c;包含文件&#xff08;File&#xff09;、编辑&#xff08;Edit&#xff09;、查看&#xff08;View&#xff09;、导航&a…

ICMAN液位检测——WS003B管道检测模组

ICMAN液位检测之WS003B管道检测模组 体积小&#xff0c;成本低&#xff0c; 液位检测精度高&#xff0c; 有水输出低电平无水高电平&#xff0c; 适用于饮水机、咖啡机、扫地机器人、洗地机等&#xff0c; 有需要朋友快联系我吧&#xff01; AWE展会不容错过的ICMAN检测模组…

RabbitMQ实践——搭建多人聊天服务

大纲 用户登录创建聊天室监听Stream&#xff08;聊天室&#xff09;发送消息实验登录Tom侧Jerry侧 创建聊天室Jerry侧Tom侧 进入聊天室Jerry侧Tom侧 发送消息Jerry发送消息Jerry侧聊天室Tom侧聊天室 Tom发送消息Jerry侧聊天室Tom侧聊天室 代码工程参考资料 在《RabbitMQ实践——…

Webpack: 前端资深构建工具

概述 如果你是一名前端工程师&#xff0c;相信之前或多或少听过、用过 Webpack 这一构建工具&#xff0c;它能够融合多种工程化工具&#xff0c;将开发阶段的应用代码编译、打包成适合网络分发、客户端运行的应用产物如今&#xff0c;Webpack 已经深深渗入到前端工程的方方面面…

简单了解IoC

IoC 什么是IoC&#xff1f; IoC&#xff08;Inversion of Control&#xff09;&#xff0c;即控制反转&#xff0c;这是一种设计思想&#xff0c;在Spring指将对象的控制权交给Spring容器&#xff0c;由容器来实现对象的创建、管理&#xff0c;程序员只需要从容器获取想要的对…

java设计模式(四)原型模式(Prototype Pattern)

1、模式介绍&#xff1a; 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许对象在创建新实例时通过复制现有实例而不是通过实例化新对象来完成。这样做可以避免耗费大量的资源和时间来初始化对象。原型模式涉及一个被复制的原型对象…