求解仓库设置位置问题

求解仓库设置位置问题

城市街道图如图所示,所有街道都是水平或者垂直分布,假设水平和垂直方形均有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;
}
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值