街区最短路径问题

来源:互联网 发布:sai软件上色 编辑:程序博客网 时间:2024/05/12 22:23

描述
一个街区有很多住户,街区的街道只能为东西、南北两种方向。

住户只可以沿着街道行走。

各个街道之间的间隔相等。

用(x,y)来表示住户坐在的街区。

例如(4,20),表示用户在东西方向第4个街道,南北方向第20个街道。

现在要建一个邮局,使得各个住户到邮局的距离之和最少。

求现在这个邮局应该建在那个地方使得所有住户距离之和最小;

输入
第一行一个整数n<20,表示有n组测试数据,下面是n组数据;
每组第一行一个整数m<20,表示本组有m个住户,下面的m行每行有两个整数0<x,y<100,表示某个用户所在街区的坐标。
m行后是新一组的数据;
输出
每组数据输出到邮局最小的距离和,回车结束;
样例输入
231 12 11 252 9 5 2011 91 11 20
样例输出
244

#include<stdio.h>#include<math.h>/*解题思路:这道题求的距离和是沿着街道行走的距离和,并不是直线之间的距离。  所以我们可以将X轴和Y轴进行分解,首先将所有居民位置投影到X轴上,找出X轴上  到各投影点距离和最短的点。同理对Y轴进行处理。得到邮局的坐标点。距离和求  解较为简单。*/int main(){int n,m,i,j,t,s1,s2;int min[2],x[20]={0},y[20]={0};scanf("%d",&n);while(n--){//数据的输入scanf("%d",&m);for(i=0;i<m;i++){scanf("%d%d",&x[i],&y[i]);}min[0]=0;min[1]=0;//对X1~Xm排序,距离和最小的点有很多,X(m/2)一定符合要求for(i=0;i<m;i++)for(j=i+1;j<m;j++){if(x[i]>x[j]){t=x[i];x[i]=x[j];x[j]=t;}if(y[i]>y[j]){t=y[i];y[i]=y[j];y[j]=t;}}for(i=0;i<m;i++){if(x[i]>x[m/2])min[0]+=x[i]-x[m/2];elsemin[0]-=x[i]-x[m/2];if(y[i]>y[m/2])min[1]+=y[i]-y[m/2];elsemin[1]-=y[i]-y[m/2];}//不用输出邮局坐标,输出最小距离和就行printf("%d\n",min[0]+min[1]);}}