#include<iostream>
#include<cmath>
#include <fstream>
#include<string>
#include <cstdlib>
using namespace std;
int N; //N是居民点的个数
int x[1000]; //居民点的x坐标数组
int y[1000]; //居民点的y坐标数组
void input(string fn) //输入数据文件函数
{
ifstream fin(fn.c_str()); //打开第 i 个文件
fin>>N; //读取居民点个数
for(int i=0;i<N;i++) //循环读取每个居民点的坐标值
{
fin>>x[i]>>y[i]; //读取居民点的坐标值,放在居民点的坐标数组中
}
fin.close(); //文件读取完之后关闭文件
}
int divide(int m[], int left, int right) //left为数组第一个元素,right是数组最后一个元素
{
int x = m[right]; //输入数据的最后一个元素是主元
int i = left - 1; //i是最后一个小于主元的数的下标
for (int j = left; j < right; j++) //遍历下标由left到right-1的数
{
if (m[j] < x) //如果数小于主元的话就将i向前移动一个位子,然后交换j和i所分别指向的数
{
int temp;
i++;
temp = m[i];
m[i] = m[j];
m[j] = temp;
}
}
//循环结束后下标为从left到i(包括i)的数都是小于x的数,接下来将主元和i+1位置上面的数进行交换
m[right] = m[i + 1];
m[i + 1] = x;
return i + 1;
}
void QSort(int a[], int left, int right) //运用分治思想
{
if (left < right)
{
int p = divide(a, left, right);
QSort(a, left, p - 1);
QSort(a, p + 1, right);
}
}
void getMinSumDistance(int *x,int *y,int N) //求距离总和最小值
{
int dx; //x坐标中位数
int dy; //y坐标中位数
int Distance=0; //n个居民点到该邮局的距离的总和
QSort(x,0,N-1);
QSort(y,0,N-1);
dx=x[N/2]; //求X坐标中位数
dy=y[N/2]; //求Y坐标中位数
// for(int i=0;i<N;i++) //计算距离总和
// Distance += abs(x[i]-dx)+abs(y[i]-dy);
// cout<<"all居民点到邮局的MinSumDistance:"<<Distance<<endl; //输出最短距离
cout<<"x:"<<dx<<endl;
cout<<"y:"<<dy<<endl;
}
int main()
{
int i=1;
string fn, st1="input_assign01_0",st2="1234567",st3=".txt"; //拼出第 i 个文件的文件名
// for(i=1;i<=1;i++)
// {
// cout<<"第"<<i<<"组data"<<endl;
// fn=st1+st2.substr(i-1,1)+st3;
// input(fn);
// getMinSumDistance(x,y,N);
// }
fn=st1+st2.substr(i-1,1)+st3;
input(fn);
getMinSumDistance(x,y,N);
system("pause");
return 0;
}
07-15
1298
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
05-05
321
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
10-16
05-17
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交