最近點對演算法—分治法實現
阿新 • • 發佈:2019-01-28
內容會持續更新,有錯誤的地方歡迎指正,謝謝!
前言:博主最近正在學習《演算法》這門專業課程,這是該課程的第二次上機題目,我把自己的解題方法分享給大家,歡迎討論!
題目:
建立100個隨機點,並計算最近的兩個點之間的距離,輸出隨機生成的100個點的座標、最近的兩個點的座標及其之間的距離、並用#include <graphics.h>
畫出整個介面並連線最近的兩個點。
非分治法實現的程式碼:
#include <iostream>
#include <time.h>
#include <math.h>
#include <graphics.h>
using namespace std;
struct Point
{
int x;
int y;
};
double Distance(Point , Point );
int main()
{
initgraph(960, 540);//建立1080*850的繪圖視窗
setcolor(WHITE);//設定點的顏色為白色
Point point[100] = { 0,0 };
srand(time(NULL));
for (int i = 0; i < 100; ++i)
{
point[i].x = rand() % 960 ;
point[i].y = rand() % 540;
circle(point[i].x, point[i].y, 1);//畫出每個點
//cout << "(" << point[i].x << "," << point[i].y << ")" << endl;
}
double distance = Distance(point[0], point[1]);
int first, second;
for (int i = 0; i < 100; ++i)
{
for (int j = i+1; j < 100; ++j)
{
if (distance > Distance(point[i], point[j]))
{
distance = Distance(point[i], point[j]);
first = i;
second = j;
}
}
}
setlinecolor(RED);//設定線的顏色
line(point[first].x, point[first].y, point[second].x, point[second].y);//畫線
//cout << "Min Distance Is " << distance << endl;
//cout << "這兩對點為" << "(" << point[first].x << "," << point[first].y << ")" << "(" << point[second].x << "," << point[second].y << ")" << endl;
system("pause");
return 0;
}
double Distance(Point point1,Point point2)
{
double distance = sqrt(pow(point1.x - point2.x, 2) + pow(point1.y - point2.y, 2));
return distance;
}
不取消現在的註釋,則輸出圖形介面;取消現在的註釋並註釋掉圖形介面相關程式碼,則輸出文字介面。
最終效果圖:(最近的兩點已通過紅線相連)