c语言最近点对问题(4个点)-分治法递归
本文给出随机产生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.2分治法 2.二维空间 代码参考链接: http://t.csdn.cn/flREB 1.一维空间 1.1蛮力法 代码: import ...
- C语言实现最大字段和(动态规划法和分治法)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.动态规划法 二.分治法 三.程序总代码 总结 前言 本次将对最大字段和使用C语言实现的两种方法实现,动态规划法和分 ...
- C/C++语言100题练习计划 89——归并排序(分治法实现)
名人说:博学之,审问之,慎思之,明辨之,笃行之.--<中庸> 进度:C/C++语言100题练习计划专栏,目前89/100
- 分治法求平面最近点对入门
一.平面最近点对问题. 平面最近点对:在一个平面上有 n n n个点,求出距离最近的两个点. 平面最近点对是计算几何中一个十分经典且基础的问题,通常采用分治法来解决. 二.直线最近点对的分治法. 在用 ...
- 算法设计与分析 实验二 分治法求解最近点对问题
分治法求解最近点对问题 一.实验目的与要求 1.实验基本要求 2.实验亮点 二.实验内容与方法 三.实验步骤与过程 (一)一些准备工作 1.实验流程 2.数据生成与去除重复点 (二)暴力穷举法 1.算 ...
- 分治法实现最近点对问题——C语言可视化
1. 分治法步骤 1.按x对点对数组进行从小到大排序 2.找出x中间值,按中间值划分数组为左右两部分 3.不断细分,找出左右两部分的最近点对 4.重复步骤1.2.3,得到最终左右两部分的最近点对的距离 ...
- Java实现算法导论中最近点对问题分治法
最近点对问题:给定平面上的N个点,找出距离最近的两个点.分治法: 1 )如果数组长度(即点的个数,一般≤3)在一定范围内时直接求出最近点,蛮力求解,递归退出条件: ...
- 用C语言实现分治方法数组的排序,C语言实现分治法实例
本文为大家分享了C语言实现分治法实例代码,供大家参考,具体内容如下 使用分治法求最大值 这个函数将数组a[l]...a[r]分成a[l],...,a[m]和a[m+1],...a[r]两部分,分别求出 ...
- 算法分析与设计——分治法最近点对
分治法最近点对 分治法 分治法将一个难以直接解决的大问题划分成一些规模较小的子问题,分别求解各个子问题,再合并子问题的解得到原问题的解. 一般来说,分治法的求解过程由以下三个阶段组成: 划分:把规模为 ...
最新文章
- 上不了名校?可以在 GitHub 上读他们的课程
- Centos-6 编译安装实现LAMP,wordpress最新版
- python中的类和对象
- Linux环境下Redmine的安装(一)
- 计算机应用基础模块2客观题答案 文档,计算机应用基础网上形考答案模块2 Word 2010 文字处理系统客观题答案(精).doc...
- 真正的动态声明性组件
- spring boot maven项目返回值乱码的解决方法
- php curl_error源码,PHP curl_error函数
- Kerberos工作流:一个简单示例
- 实时计算之storm
- [Python] 对 Python 装饰器的理解心得
- 安装深度linux系统卡住不动,简单有效!一招解决深度Linux死机问题
- Make the most of your 20s
- C# 判断有向图是否存在环
- tensorflow-tf基础
- IIS的ARR搭建本地服务器的不停机更新(负载均衡,分布式服务器,集群)
- 【智能QbD风险评估工具】上海道宁为您带来智能QbD风险评估工具——LeanQbD
- 数据库:故障种类,恢复技术,备份方式
- 锐龙r9 4900H怎么样?相当于什么水平级别?
- 【免费送书】小白也能学会的Webpack 应用瘦身技巧
热门文章
- 华为IT“智”存高远,普“慧”于民
- 主元分析matlab,主元分析不同方法计算结果不一样
- linux环境变量LIBRARY_PATH和LD_LIBRARY_PATH
- 禁止Windows10系统调整屏幕分辨率的方法
- Starvis星光全彩摄像机技术
- 使用微PE工具箱PE装机工具U盘重装系统win11
- JavaScript 日期操作我不知道的事情
- 头条号:增加粉丝量 只需用四招!
- python七段数码管显示字母代码_python实现七段数码管显示
- 2017,知识与财富