建物流中转站
题目描述
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。
思路:
穷举法。
- 使用unordered_multimap记录房子的位置。
- 遍历栅格,计算最小距离,并且记录该栅格的状态(房子,空地)。
- 特殊情况,某两个位置距离相等,但是1个是房子,1个是空地,此时是可以修建的。
代码:
#include<iostream>
#include<vector>
#include<unordered_map> //unordered_multimap
#include<limits.h> //INT_MAX
using namespace std;
vector<vector<int>> nums(1005,vector<int>(1005,0));
int main()
{
unordered_multimap<int,int> house;
int N;
cin>>N;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cin>>nums[i][j];
if(nums[i][j])
house.insert(make_pair(i,j)); //记录房子位置
}
}
/
int min_dist = INT_MAX;
int type=1;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
int tmp_dist=0;
for(unordered_map<int,int>::iterator it=house.begin();it!=house.end();it++)
{
tmp_dist+=abs(i-it->first)+abs(j-it->second);
}
if(min_dist > tmp_dist || (min_dist == tmp_dist && nums[i][j]==0) )
{
min_dist=tmp_dist;
type=nums[i][j];
}
}
}
if(type)
cout<<-1<<endl;
else
cout<<min_dist<<endl;
return 0;
}
结果: