邮局选址问题

#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;

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值