题目描述: 

Shopee物流会有很多个中转站。在选址的过程中,会选择离用户最近的地方建一个物流中转站。假设给你一个二维平面网格,每个格子是房子则为1,或者是空地则为0。找到一个空地修建一个物流中转站,使得这个物流中转站到所有的房子的距离之和最小。 能修建,则返回最小的距离和。如果无法修建,则返回 -1。

若范围限制在100*100以内的网格,如何计算出最小的距离和?

当平面网格非常大的情况下,如何避免不必要的计算?

解释:

暴力求解的思想就是直接根据问题来找答案。该问题可以直接转换成再一个X、Y坐标系中找到一个0点到所有1点的距离之和最小,而这里的距离并不是两点之间线段最短的距离。但可以用两点之间线段最短的思想来解题,问题就转化成了,只要能知道0点坐标x1、y1和1点坐标x2、y2即可求出两点之间的距离来,再将所有1点到该0点的距离相加即可得到该0点到所有1点的距离之和了,将该距离值保存起来。当矩阵中所有0点到各个1点的距离和求完之后再从储存的距离值中找到最小的那个值即为最小距离和。目的很明确,方法也很容易想到,根据每一步的目的简单明了的求解。

代码:

/**暴力求解:该方法的思想很简单,直接遍历每一个0位置到每一个1位置的距离之和,再将这些距离和组成一个数组,再遍历该数组得到一个最小值即为最小距离和
**/#include<iostream>
#include<math.h>using namespace std;int main()
{int N;//确定矩阵的大小int a[105][105];//存放矩阵double b[10001];//存放假设每一个空地建造中转站时各个城市到该地的最短距离, 这里数组要声明的大一点,不然会溢出int count1=0;//用于记录存放于矩阵中的数据中1的个数cout<<"请输入矩阵大小:";cin>>N;cout<<endl;cout<<"请输入矩阵的值:\n";for(int i=0;i<N;i++){for(int j=0;j<N;j++){cin>>a[i][j];if(a[i][j]==1){count1++;}}}cout<<endl;//该部分用于计算每一个可用于建造中转站的点到城市的距离之和,并存储于数组b中,用于后续选出最短距离和int count=0;for(int i=0;i<N;i++){for(int j=0;j<N;j++){if(a[i][j]==0){int x1=i;//记录为可以建造中转站的地点的x坐标int y1=j;//记录为可以建造中转站的地点的y坐标double lenSum=0;//用于累加中转站到每一个城市的距离for(int i=0;i<N;i++){for(int j=0;j<N;j++){if(a[i][j]!=0){int x2=i;//记录城市的x坐标int y2=j;//记录尘世的y坐标lenSum+=sqrt((x1-x2)*(x1-x2))+sqrt((y1-y2)*(y1-y2));//累加每一个1到该0位置的距离}else{lenSum+=0;}}}b[count]=lenSum;count++;}}}//该部分用于判断矩阵是否全为1if(count1==N*N){cout<<"无法建造中转站";//cout<<-1;}else{double temp=9999999;//用于选出b数组中的最短距离for(int i=0;i<count;i++){if(b[i]<temp){temp=b[i];}else{temp=temp;}}int minlength = (double)temp;//强制转换double---->intcout<<"最短距离和为:";cout<<minlength;}return 0;
}

运行截图:

暴力求解之中转站问题相关推荐

  1. 每天一道算法题-暴力求解建物流中间站

    Shopee物流会有很多个中转站.在选址的过程中,会选择离用户最近的地方建一个物流中转站. 假设给你一个二维平面网格,每个格子是房子则为1,或者是空地则为0.找到一个空地修建一个物流中转站,使得这个物 ...

  2. Floyd(弗洛伊德)算法(邻接矩阵与邻接表实现)——暴力求解多源点最短路

    文章目录 Floyd(弗洛伊德)算法(邻接矩阵与邻接表实现)--暴力求解多源点最短路 简介 思想与原理 邻接矩阵解题模板 邻接表解题模板 Floyd(弗洛伊德)算法(邻接矩阵与邻接表实现)--暴力求解 ...

  3. NYOJ 643 发短信 暴力求解

    发短信 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 下图是手机常用的九键英文输入法界面,如果要输入字母'A',我们只 需要按一次数字键2,按键顺序记为2:如果要输入字 ...

  4. 第四章 分治策略 4.1 最大子数组问题 (暴力求解算法)

    /*** 最大子数组的暴力求解算法,复杂度为o(n2)* @param n* @return*/static MaxSubarray findMaxSubarraySlower(int[] n) {l ...

  5. python输入多个字符串、输入最长的一串_无重复字符的最长子串(Python之暴力求解)...

    无重复字符的最长子串(Python之暴力求解) 例题: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: (1) 输入: "abcabcbb" 输出: 3 ...

  6. 考研概率论--87年真题--MATLAB暴力求解

    考研概率论--87年真题--MATLAB暴力求解 1. 问题描述 2. MATLAB代码 3. 运行结果 4. 总结 1. 问题描述 (1987考研数学真题)假设有两箱同种零件:第一箱内装50件,其中 ...

  7. 斗地主残局破解算法,斗地主残局暴力求解器算法,秒解各种斗地主残局

    斗地主残局破解,斗地主残局暴力求解器,秒解各种斗地主残局 秒解抖音.微信等各大平台的斗地主残局挑战 支持自定义出牌规则 输入双方的牌后单击"开始求解"按钮即可 求解完成后,电脑会自 ...

  8. 算法 |【实验5.2】1-深度优先搜索暴力求解旅行商问题

    文章目录 使用深度优先搜索暴力求解旅行商问题 1.题目描述 2.问题分析与算法设计思路 3.算法实现 4.运行结果 5.算法分析 使用深度优先搜索暴力求解旅行商问题 1.题目描述 商品推销员要去n个城 ...

  9. Codeforces 993A. Two Squares(暴力求解)

    解题思路(暴力解法) 平行于x轴的正方形和与x轴成45度倾斜的正方形相交的点中必定有整数点.即若两正方形相交,必定存在整数i,j,使(i,j)同时属于两个正方形. 我们把两个正方形中的整数点都找出来, ...

最新文章

  1. 压缩人工智能的数据值
  2. Spring基础专题——第五章(Aop代理)
  3. 使用pydub做静音帧去除
  4. 属性驱动的架构设计方法图解【转载】
  5. 如何让VB6代码编辑器垂直滚动条随鼠标滚轮滚动
  6. LeetCode 13罗马数字转整数14最长公共前缀
  7. webkit事件处理
  8. Uniapp 导入 Vant 组件库
  9. 拳王虚拟项目公社:通过信息差获免费取虚拟资源,网上怎么售卖教程赚钱
  10. 通过pgpool-II实现PostgreSQL数据库服务高可用
  11. 【Adobe Illustrator 教程】4. 认识渐变工具
  12. java 注解field_jackson学习之七:常用Field注解
  13. java语言将一个字符串集合按GBK编码(简体中文按拼音顺序)排序
  14. 智能问答技术概览及在小爱同学的实践
  15. 如何将照片设置为手机墙纸/桌面
  16. Butter Knife[黄油刀]配置
  17. 一文读懂Auth0与Azure AD的区别
  18. increment java_Java中的increment()有什么作用?
  19. 计算机把C盘无法扩展,c盘不能扩展卷【解决教程】
  20. SpringBoot+MyBatis+MySql实现的医院管理系统

热门文章

  1. 瑞士军刀 netcat
  2. 薪酬管理资料(最新修订版)
  3. 问答精选|新年特辑:全方位揭秘MeterSphere一站式开源持续测试平台
  4. 手机系列:中国移动梦网(GPRS)解读
  5. 腾龙视觉设计学院王珂老师讲3dsmax课录屏
  6. 详解西部数据SMR叠瓦式硬盘的190二级编译器(译码表)模块
  7. 电子计算机俗称电脑它是一种具有什么能力,2012年计算机一级MSoffice试题及答案解析(60)...
  8. SATA游标卡尺测量时显示闪烁
  9. oracle tabe unlock_oracle DBA必需掌握的常用命令集锦
  10. java调用g726_AACEncode: Android G711(PCMA/PCMU)、G726、PCM音频转码到AAC