每天一道算法题-暴力求解建物流中间站
Shopee物流会有很多个中转站。在选址的过程中,会选择离用户最近的地方建一个物流中转站。
假设给你一个二维平面网格,每个格子是房子则为1,或者是空地则为0。找到一个空地修建一个物流中转站,使得这个物流中转站到所有的房子的距离之和最小。 能修建,则返回最小的距离和。如果无法修建,则返回 -1。
若范围限制在100*100以内的网格,如何计算出最小的距离和?
当平面网格非常大的情况下,如何避免不必要的计算?
输入描述:
4 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0先输入方阵阶数,然后逐行输入房子和空地的数据,以空格分隔。
输出描述:
8能修建,则返回最小的距离和。如果无法修建,则返回 -1。
示例1
输入
4 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0
输出
8
分析
通过暴力求解,建立辅助数组result,计算每一个空地到房子的距离之和,然后通过比较大小的方式解决问题。
遍历原数组,如果为0则将假设该地为中间站,计算中转站到后面房子的距离(横纵坐标绝对值)。
那么中转站到前面房子的值呢,可以通过遍历到1的时候,累加1到后面0(中转站)的距离值到result当中,这样就解决了该问题,或者是通过数组的逆序遍历计算距离值也可以行。
package com.ep.shop.test;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int [][] q = new int[n][n];int [][] result = new int[n][n];for(int i=0; i < n; i++){for(int j=0; j < n; j++){q[i][j] = sc.nextInt();result[i][j] = 0;}}sc.close();for(int i=0; i < n; i++){for(int j=0; j < n; j++){if(q[i][j] == 0){findOne(q, result, i, j, n); //碰到0就往后面找1}else{result[i][j] = Integer.MAX_VALUE;findZero(q, result,i, j, n); //否则就找0}}}int minResult = Integer.MAX_VALUE;for(int i=0; i < n; i++){for(int j=0; j < n; j++){if(result[i][j] < minResult){minResult = result[i][j];}}}minResult = minResult == Integer.MAX_VALUE ? -1: minResult;System.out.println(minResult);for(int i=0; i < n; i++){for(int j=0; j < n; j++){System.out.print(result[i][j]+" ");}System.out.println();}}private static void findZero(int[][] q, int[][] result, int x, int y, int n) {int j = y;for(int i=x; i < n; i++){for(; j < n; j++){if(q[i][j] == 0){result[i][j] += (Math.abs(i - x) + Math.abs(j - y)); //把距离分散到碰到的0上面}}j = 0;}}private static void findOne(int[][] q, int[][] result, int x, int y, int n) {int j = y;for(int i=x; i < n; i++){for(; j < n; j++){if(q[i][j] == 1){result[x][y] += (Math.abs(i - x) + Math.abs(j - y)); //把距离累加到 result[x][y]上}}j = 0;}}}
每天一道算法题-暴力求解建物流中间站相关推荐
- 一天一道算法题--5.30---递归
感谢微信平台: 一天一道算法题 --------每天多一点进步--------- 今天 休假 这题 也很水 能发现 规律就好 明天 再也不能这样了 forgive me ---------- 转载于 ...
- 一天一道算法题--6.15--卡特兰数
感谢微信平台---一天一道算法题---每天多一点进步- problem: 12个高矮不同的人 排成两排 每排必须是从矮到高排列 而且第二行比对应的第一排的人高 问排列方式有多少种? analyse: ...
- 一道算法题跟大家分享
无意中看到一道算法题,拿出我的解法与大家分享. 题目:输出1,2,3,4四个数字能组成的互不相同且无重复的三位数并统计满足条件的三位数个数 大家先想想,再看答案吧. View Code 1 /// & ...
- 每天一道算法题系列十七之电话号码的字母组合
每天一道算法题系列: 来源:力扣(LeetCode) 本题链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-numb ...
- 搜狗2020秋招笔试的一道算法题
搜狗2020秋招的一道算法题 有A,B,C三种样品,凑齐三个样品各一个就可以领取一个奖品.任意两个样品可兑换另一种样品,如AA可兑换一个B或一个C,AB可兑换一个C.输入ABC,问最多可以领取多少奖品 ...
- 每天一道算法题系列十二之整数转罗马数字
每天一道算法题系列: 来源:力扣(LeetCode) 本题链接:https://leetcode-cn.com/problems/integer-to-roman/ 来源是力扣,大家喜欢可以去力扣中文 ...
- 截止目前为止,我遇到的最难的一道算法题:计算相邻两个数的最大差值
hello,今天给大家带来一道算法题.这道算法题,是我目前为止,见过最难的一道题.那么到底是怎样的一道算法题呢?如下: 题目:给定一个数组, 求如果排序之后, 相邻两数的最大差值. 要求时间复杂度O( ...
- 算法题中求解绝对值最值的技巧
引言 现在算法题中,有时会遇到求解绝对值最值的问题,比如给定一个数组,求解 a b s ∣ a i − a j ∣ abs|a_i - a_j| abs∣ai−aj∣的最大值.诸如此类问题,暴力解 ...
- Homebrew作者面试Google被拒,只因写不出一道算法题
相信很多人听说过关于Max Howell(Homebrew的作者)的故事: Max Howell在Google面试,但Google拒绝了他,给出的答复是:"虽然我们90%的工程师都用你写的软 ...
最新文章
- C# 实现对接电信交费易自动缴费 续(winio/winring0 自动填密码)
- Feature Selection: A Data Perspective --阅读笔记2 传统数据的特征选择算法
- 干货 | 广电行业数字化时代的「数据破局」指南
- 在nodejs websocket回调函数中没法用this
- 一文读懂类加载机制 --- ClassLoader
- 邮箱服务器怎么清理缓存,如何清除Outlook的附件缓存?
- 二值化区分前景和背景
- 2020Java学习路线(珍藏版)
- Ovi商店开发者注册发布指南
- Head First Java习题练习(二)
- python批量解压文件_Python 批量解压ZIP和RAR压缩文件(循环验证密码)
- 图像与视频的Alpha通道
- 大家都买用阿里云服务器干什么用?
- Unreal 4 更改Engine位置
- Sql2012的下载与安装
- CSS预处理器-Sass、Less和Stylus-介绍和使用
- Adapter适配器
- IDEA 远程调试springboot
- 安装opensips时创建MySQL表_opensips在创建数据库时报错
- 试看不同PCI-E带宽对Radeon HD 7970性能的影响
热门文章
- QT通过QAxWidget嵌入IE浏览器并获取页面源码
- 推荐一款免费报表工具,一键自动生成分析报告
- 可调式直流电源需要注意哪些以防止损坏?
- _attribute用法总结
- android - androi…
- 《21世纪机器人》一一2.7 货物搬运工晨明号:重启前1小时
- win 10 源码安装 Davinci
- 游戏片子“战火兄弟连”正式公映
- 2021年电工(高级)考试题库及电工(高级)免费试题
- 动力系统服务器更新时间,10月14日“风雷纵横”秋季版本服务器维护公告(已完成)...