程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 街區最短路徑問題,街區路徑問題

街區最短路徑問題,街區路徑問題

編輯:C++入門知識

街區最短路徑問題,街區路徑問題


題目來源自http://acm.nyist.net/JudgeOnline/problem.php?pid=7

 

描述一個街區有很多住戶,街區的街道只能為東西、南北兩種方向。

住戶只可以沿著街道行走。

各個街道之間的間隔相等。

用(x,y)來表示住戶坐在的街區。

例如(4,20),表示用戶在東西方向第4個街道,南北方向第20個街道。

現在要建一個郵局,使得各個住戶到郵局的距離之和最少。

求現在這個郵局應該建在那個地方使得所有住戶距離之和最小;

 
輸入
第一行一個整數n<20,表示有n組測試數據,下面是n組數據;
每組第一行一個整數m<20,表示本組有m個住戶,下面的m行每行有兩個整數0<x,y<100,表示某個用戶所在街區的坐標。
m行後是新一組的數據;
輸出
每組數據輸出到郵局最小的距離和,回車結束;
樣例輸入
2
3
1 1
2 1
1 2
5
2 9 
5 20
11 9
1 1
1 20
樣例輸出
2
44


最短路徑肯定是在這幾個點所圍成的圈內的,這樣直接遍歷求和,然後取最小值就好了,代碼如下
  1 #include"header_file.h"
  2 using namespace std;
  3 
  4 int get_max(vector<int> v)
  5 {
  6     int max;
  7     max=v[0];
  8     for(int i=0;i<v.size();i++)
  9     {
 10         if(max<v[i])
 11         {
 12             max=v[i];
 13         }
 14     }
 15     return max;
 16 }
 17 
 18 int get_min(vector<int> v)
 19 {
 20     int min;
 21     min=v[0];
 22     for(int i=0;i<v.size();i++)
 23     {
 24         if(min>v[i])
 25         {
 26             min=v[i];
 27         }
 28     }
 29     return min;
 30 }
 31 
 32 int get_sum(vector<int> vx,vector<int> vy,int x,int y)
 33 {
 34     int sum=0;
 35     for(int i=0;i<vx.size();i++)
 36     {
 37         if((x-vx[i])>=0)
 38         {
 39             sum=sum+x-vx[i];
 40         }
 41         else
 42         {
 43             sum=sum+vx[i]-x;
 44         }
 45     }
 46     for(int i=0;i<vy.size();i++)
 47     {
 48         if((y-vy[i])>=0)
 49         {
 50             sum=sum+y-vy[i];
 51         }
 52         else
 53         {
 54             sum=sum+vy[i]-y;
 55         }
 56     }
 57     return sum;
 58 }
 59 
 60 int get_short_path(vector<int> vx,vector<int> vy,int m)
 61 {
 62     int vx_max,vx_min;
 63     int vy_max,vy_min;
 64     vx_max=get_max(vx);
 65     vx_min=get_min(vx);
 66     vy_max=get_max(vy);
 67     vy_min=get_min(vy);
 68     
 69     vector<int> v;
 70     for(int i=vx_min;i<=vx_max;i++)
 71     {
 72         for(int j=vy_min;j<=vy_max;j++)
 73         {
 74             int sum;
 75             sum=get_sum(vx,vy,i,j);
 76             v.push_back(sum);
 77         }
 78     }
 79     
 80     return get_min(v);
 81 }
 82 
 83 int main(void)
 84 {
 85     int m;
 86     cout<<"input m:";
 87     cin>>m;
 88     
 89     vector<int> vx,vy;
 90     
 91     for(int i=0;i<m;i++)
 92     {
 93         int x,y;
 94         cin>>x>>y;
 95         vx.push_back(x);
 96         vy.push_back(y);
 97     }
 98     
 99     cout<<get_short_path(vx,vy,m);
100 }

 



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved