最近对问题的分治算法(C++)

本文介绍了一种寻找二维平面上最近点对的有效算法,并通过递归方式实现了该算法。通过对一系列点进行处理,该算法能够找出距离最近的两个点及其之间的距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

#include<stdio.h>
#include
<sstream>
#include 
<map>
#include 
<iostream>
#include 
<math.h>
using namespace std;
#define N 5;
#define M 5000;
typedef  
struct Point
{
 
int x;
 
int y;
} Point;
Point P[
50] ;
int GetNearest(int i,int j)
{  
 
if(i==j-1)
 {
  
return (P[i].x-P[j].x)*(P[i].x-P[j].x)+(P[i].y-P[j].y)*(P[i].y-P[j].y);
 }
 
else 
 {
  
int mid=(i+j)/2;
  
int n1,n2;
  
if(i<mid)
  {
    n1
=GetNearest(i,mid);    
  }
  
else
  {
   n1
=M;
  }
  
if(j>mid+1)
  {
    n2
=GetNearest(mid+1,j);    
  }
  
else
  {
   n2
=M;
  }
  
int min=n1;
  
if(n2<n1)
  {
   min
=n2;
  }
  
for(int k=i;k<=mid;k++)
  {
   
if(P[k].x>=P[mid].x-n1)
   {
    
for(int l=mid+1;l<=j;l++)
    {
     
if(P[l].x<=P[mid].x+n1)
     {
      
int dis=(P[i].x-P[j].x)*(P[i].x-P[j].x)+(P[i].y-P[j].y)*(P[i].y-P[j].y);
      
if(dis<min)
      {
       min
=dis;
      }
     }
    }
   }
  }
  
return min;
 }
}
void main()
{  
 
 
for(int i=0;i<50;i++)
 {
  P[i].x
=i;
  P[i].y
=2*i;
 }
 P[
5].x=5;
 P[
5].y=9;
 
int mindis=GetNearest(0,49);

}
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值