切換
舊版
前往
大廳
主題

[創作|作業][C++]演算法Week4:1-Closest pair of 2D points

極巨龍神塔奇 | 2018-05-05 18:05:27 | 巴幣 2 | 人氣 1042

最近二維點對
請利用最近二維點對演算法,解決最近二維點對問題。
以下給定 n 個二維平面點,找出其中距離最近的二個點的距離,例如:(5, 3), (9, 6), (5, 1) 最近二維點對距離為 2,則輸出至小數點後 3 位:2.000。
Input
第一行為 n 代表總共有 n 組二維點對問題。
第二行為 m 代表此二維點對共有 m 個點。
接下來的 m 行,每一行都是一個二維點的 x, y 座標,中間以空白隔開。
Output
輸出最近的點對距離,並且輸出至小數點後第 3 位,例如距離為 2 則輸出 2.000。
範例輸入:
3
2
5 3
9 6
3
5 3
9 6
5 1
4
5 3
9 6
5 1
4 4
範例輸出:
5.000
2.000
1.414


/*----- ----- ----- -----*/
//1-Closest pair of 2D points
//Made by 105502555 Teemo Hsu(Synasaivaltos)
//Date: 2018/04/24
/*----- ----- ----- -----*/
#include <iostream>
#include <climits>
#include <cmath>
#include <iomanip>
#include <vector>

using namespace std;

int main(void)
{
   int n;
   cin >> n;
   vector<double> ans;
   ans.resize(n);
   fill(ans.begin(),ans.end(),INT_MAX);

   while(--n>=0)
   {
      int m;
      cin >> m;
      vector<double> x,y;
      x.resize(m);
      y.resize(m);

      while(--m>=0)
      {
         cin >> x.at(x.size()-m-1) >> y.at(y.size()-m-1);
      }

      for(int i=0;i<x.size();i++)
      {
         for(int j=i+1;j<y.size();j++)
         {
            if(ans.at(ans.size()-n-1)>pow((pow((x.at(i)-x.at(j)),2.)+pow((y.at(i)-y.at(j)),2.)),0.5))
               ans.at(ans.size()-n-1)=pow((pow((x.at(i)-x.at(j)),2.)+pow((y.at(i)-y.at(j)),2.)),0.5);
         }
      }
   }

   for(int i=0;i<ans.size();cout<<fixed<<setprecision(3)<<ans.at(i)<<endl,i++);

   return 0;
}
送禮物贊助創作者 !
0
留言

創作回應

更多創作