求解仓库设置位置问题
城市街道图如图所示,所有街道都是水平或者垂直分布,假设水平和垂直方形均有m+1条,任何两个相邻位置之间的距离为1。在街道的十字路口有n个商店,图中的n=3、m=8,3个商店的坐标位置分别是(2,4)、(5,3)和(6,6)。现在需要在某个路口设置建立一个合用的仓库。若仓库位置为(3,5),那么这三个商店到仓库的路程总长度最少是10,设计一个算法找到仓库的最佳位置,使得所有商店到仓库的路程的总长度达到最短。
- 算法分析:
仓库位置由横竖两个坐标组成,纵轴取与每个商店横向距离总和最少的坐标,横轴类似。
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct st{//定义商店位置结构体
int x;
int y;
}store;
int main(){
store a[20];
int n,xmin=10,xmax=0,ymin=10,ymax=0;//求由商店围成的几何图形上下左右边
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i].x>>a[i].y;
if(a[i].x<xmin)
xmin=a[i].x;
if(a[i].y<ymin)
ymin=a[i].y;
if(a[i].x>xmax)
xmax=a[i].x;
if(a[i].x>ymax)
ymax=a[i].y;
}
int xsum=100,ysum=100,cx,cy;//设置仓库位置变量
for(int i=xmin;i<=xmax;i++){
int sum=0;
for(int j=0;j<n;j++){
sum+=abs(a[j].x-i);
}
if(sum<xsum){//如果当前i轴距离各商店横向距离总和比上一个i-1轴小则替换
xsum=sum;
cx=i;
}
}
for(int i=ymin;i<=ymax;i++){
int sum=0;
for(int j=0;j<n;j++){
sum+=abs(a[j].y-i);
}
if(sum<ysum){//如果当前i轴距离各商店纵向距离总和比上一个i-1轴小则替换
ysum=sum;
cy=i;
}
}
cout<<"最佳仓库位置:"<<cx<<','<<cy<<endl<<"总路程:"<<xsum+ysum<<endl;
// int tsum=1000,tx,ty; //这里为暴力求解法验证答案
// for(int i=0;i<9;i++){
// for(int j=0;j<9;j++){
// int sum=0;
// for(int k=0;k<n;k++){
// sum+=abs(a[k].x-i)+abs(a[k].y-j);
// }
// if(sum<tsum){
// tsum=sum;
// tx=i;
// ty=j;
// }
// }
// }
// cout<<"最佳仓库位置:"<<tx<<','<<ty<<endl<<"总路程:"<<tsum;
return 0;
}