本文给出随机产生4个点对的情况

//最近点对问题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>

typedef struct point
{ float x;//点的x坐标 
  float y;//点的y坐标 
}point;
//计算两点间的距离 
float distance( point s1,point s2)//计算两点间的距离 
{  return sqrt((s1.x-s2.x)*(s1.x-s2.x)+(s1.y-s2.y)*(s1.y-s2.y));
}
//快速排序
float swap(float &x,float &y)
{ float temp;
  temp=x;
  x=y;
  y=temp;
}
int part( point s[],int first,int end)

  while(first<end)
  { //右侧扫描 
   while(first<end&&s[first].y<=s[end].y)
    end--;
    //遇到s[low]>s[high] ,转到左侧
    if(first<end)
    {swap(s[first].y,s[end].y);
     first++;     } 
    //左侧扫描
    while(first<end&&s[first].y<=s[end].y) 
     first++;
    if(first<end)
    {swap(s[first].y,s[end].y);
     end--;
    }
  }
  return first;//返回划分后的轴值 
}
int quicksort( point s[],int first,int end)
{
  int pvo;
  if(first<end)
 { pvo=part(s,first,end);
   quicksort(s,first,pvo-1);
   quicksort(s,pvo+1,end);
  }
}

//找最小点对距离 
float minsearch( point s[],int n,int first,int end,point &a,point &b)
{  
 point p[n]; 
 float d;//d是目标最小距离 
  float d1,d2,d3;
  if(end-first==1)//只有两个点 
  { a=s[first];
   b=s[end];
   return distance(a,b);
  }
    
  if(end-first==2)//集合中有三个点
   { d1=distance(s[first],s[first+1]);
     d2=distance(s[first],s[end]);
     d3=distance(s[first+1],s[end]);
     if(d1<d2&&d2<d3)
       {a=s[first];
        b=s[first+1];
       d=d1;
       }
     else if(d2<d1&&d2<d3)
       {a=s[first];
        b=s[end];
       d=d2;
       }
     else
       {a=s[first+1];
        b=s[end];
       d=d3;
       }
    } 
    //对集合s进行划分
    point a1,a2,b1,b2;
    int mid=(first+end)/2;
    //对划分后的左右两个集合寻找集合中最小的距离d1,d2 
    d1=minsearch(s,n,first,mid,a1,b1);
    d2=minsearch(s,n,mid+1,end,a2,b2);
    if(d1<=d2) 
      {    d=d1;a=a1;b=b1;  }
    else
      {a=a2;b=b2;
      d=d2;}
      
    int i,index=0;
      for(i=mid;(s[mid].x-s[i].x<d)&&(i>=first);i--)
       { p[index++]=s[i];
       }
      for(i=mid+1;(s[i].x-s[mid].x<d)&&(i<=end);i++)
       { p[index++]=s[i];
       }
    quicksort(p,0,index-1);
    
    //对集合p1,p2进行处理点
    int j;
    for(i=0;i<index;i++)
    { for(j=i+1;j<index;j++)
     { if(p[j].y-p[i].y>=d)
      break;
      else
       {
       d3=distance(p[i],p[j]);
        if(d3<d) 
         {d=d3;
          a=p[i];b=p[j];
        }
       }
     }
     } 
     return d;
    //printf("%d",d);
}
//主函数 
int main()
{ int i=0;
  int n;
 
  int  low_x,high_x,low_y,high_y;
  //点的坐标准备 
   printf("请输入点的个数n:");//n个数 
   scanf("%d",&n);
   printf("请输入点(x,y)的横坐标范围:");//横纵坐标范围 
   scanf("%d %d",&low_x,&high_x);
   printf("请输入点(x,y)的纵坐标范围:"); 
  scanf("%d %d",&low_y,&high_y);
   point s[n];
  //printf("输入%d个点的坐标\n",n);
    srand(time(0));
 while(i<n)
  {//printf("第%d个点的坐标x",i+1);
   
     s[i].x=low_x+1.0*rand()/RAND_MAX*(high_x-low_x); 
   //printf("第%d个点的坐标y",i+1);
     s[i].y=low_y+1.0*rand()/RAND_MAX*(high_y-low_y); 
     i++;
   }
    point a,b;
   int first=0,end=n-1;
   float  d_min;
   d_min=minsearch(s,n,first,end,a,b);
   
   printf("最短距离为%f,坐标(%f,%f),(%f,%f)",d_min,a.x,a.y,b.x,b.y);
   for(i=0;i<n;i++)
    printf("第%d个点的坐标为(%f,%f)\n",i+1,s[i].x,s[i].y);
  
}

希望和各位大神教教我怎样突破四个点对,可以实现任意个点的情况

c语言最近点对问题(4个点)-分治法递归相关推荐

  1. 最近点对问题(蛮力法和分治法)

    最近点对问题(蛮力法和分治法) 1.一维空间 1.1蛮力法 1.2分治法 2.二维空间 代码参考链接: http://t.csdn.cn/flREB 1.一维空间 1.1蛮力法 代码: import ...

  2. C语言实现最大字段和(动态规划法和分治法)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.动态规划法 二.分治法 三.程序总代码 总结 前言 本次将对最大字段和使用C语言实现的两种方法实现,动态规划法和分 ...

  3. C/C++语言100题练习计划 89——归并排序(分治法实现)

    名人说:博学之,审问之,慎思之,明辨之,笃行之.--<中庸> 进度:C/C++语言100题练习计划专栏,目前89/100

  4. 分治法求平面最近点对入门

    一.平面最近点对问题. 平面最近点对:在一个平面上有 n n n个点,求出距离最近的两个点. 平面最近点对是计算几何中一个十分经典且基础的问题,通常采用分治法来解决. 二.直线最近点对的分治法. 在用 ...

  5. 算法设计与分析 实验二 分治法求解最近点对问题

    分治法求解最近点对问题 一.实验目的与要求 1.实验基本要求 2.实验亮点 二.实验内容与方法 三.实验步骤与过程 (一)一些准备工作 1.实验流程 2.数据生成与去除重复点 (二)暴力穷举法 1.算 ...

  6. 分治法实现最近点对问题——C语言可视化

    1. 分治法步骤 1.按x对点对数组进行从小到大排序 2.找出x中间值,按中间值划分数组为左右两部分 3.不断细分,找出左右两部分的最近点对 4.重复步骤1.2.3,得到最终左右两部分的最近点对的距离 ...

  7. Java实现算法导论中最近点对问题分治法

    最近点对问题:给定平面上的N个点,找出距离最近的两个点.分治法:              1 )如果数组长度(即点的个数,一般≤3)在一定范围内时直接求出最近点,蛮力求解,递归退出条件:       ...

  8. 用C语言实现分治方法数组的排序,C语言实现分治法实例

    本文为大家分享了C语言实现分治法实例代码,供大家参考,具体内容如下 使用分治法求最大值 这个函数将数组a[l]...a[r]分成a[l],...,a[m]和a[m+1],...a[r]两部分,分别求出 ...

  9. 算法分析与设计——分治法最近点对

    分治法最近点对 分治法 分治法将一个难以直接解决的大问题划分成一些规模较小的子问题,分别求解各个子问题,再合并子问题的解得到原问题的解. 一般来说,分治法的求解过程由以下三个阶段组成: 划分:把规模为 ...

最新文章

  1. 上不了名校?可以在 GitHub 上读他们的课程
  2. Centos-6 编译安装实现LAMP,wordpress最新版
  3. python中的类和对象
  4. Linux环境下Redmine的安装(一)
  5. 计算机应用基础模块2客观题答案 文档,计算机应用基础网上形考答案模块2 Word 2010 文字处理系统客观题答案(精).doc...
  6. 真正的动态声明性组件
  7. spring boot maven项目返回值乱码的解决方法
  8. php curl_error源码,PHP curl_error函数
  9. Kerberos工作流:一个简单示例
  10. 实时计算之storm
  11. [Python] 对 Python 装饰器的理解心得
  12. 安装深度linux系统卡住不动,简单有效!一招解决深度Linux死机问题
  13. Make the most of your 20s
  14. C# 判断有向图是否存在环
  15. tensorflow-tf基础
  16. IIS的ARR搭建本地服务器的不停机更新(负载均衡,分布式服务器,集群)
  17. 【智能QbD风险评估工具】上海道宁为您带来智能QbD风险评估工具——LeanQbD
  18. 数据库:故障种类,恢复技术,备份方式
  19. 锐龙r9 4900H怎么样?相当于什么水平级别?
  20. 【免费送书】小白也能学会的Webpack 应用瘦身技巧

热门文章

  1. 华为IT“智”存高远,普“慧”于民
  2. 主元分析matlab,主元分析不同方法计算结果不一样
  3. linux环境变量LIBRARY_PATH和LD_LIBRARY_PATH
  4. 禁止Windows10系统调整屏幕分辨率的方法
  5. Starvis星光全彩摄像机技术
  6. 使用微PE工具箱PE装机工具U盘重装系统win11
  7. JavaScript 日期操作我不知道的事情
  8. 头条号:增加粉丝量 只需用四招!
  9. python七段数码管显示字母代码_python实现七段数码管显示
  10. 2017,知识与财富