资源简介
按课本算法做出来的,请求大家指教,因为是作业所以有不必要的界面输出,请只研究核心代码。
代码片段和文件信息
#include
#include
#include
#include
#include
#include
using namespace std;
const int N = 100005;
const double MAX = 10e10;
const double eps = 0.00001;
struct Point
{
double x y;
int index;
} ;
Point a[N] b[N] c[N];
double closest(Point * Point * Point * int int);
double dis(Point Point);
int cmp_x(const void * const void*);
int cmp_y(const void * const void*);
int merge(Point * Point * int int int);
inline double min(double double);
int ClosestPoints(intPoint *int &int &);
int main()
{
int n i;
float de;
int index1=0index2=0index3=0index4=0;
char choicechoice2;
do
{
system(“cls“);
cout<<“┌─────────────────────┐“< cout<<“│实验:最近对问题 │“< cout<<“│系别:计算机工程系 │“< cout<<“│班级:07级计算机科学与技术2班 │“< cout<<“│姓名:刘菲菲 │“< cout<<“│学号:200630891032 │“< cout<<“└─────────────────────┘“< cout< cin>>n;
cout<<“输入坐标格式为3 4即(34)“< for (i = 0; i < n; i++)
{
cout<<“第“<cin>>a[i].x>>a[i].y;
}
cout<<“请选择运算方法“< cout<<“1.蛮力法 2.分治法 3.结束:“;
do
{
cin>>choice;
if (choice == ‘1‘)
{e = sqrt(ClosestPoints(naindex1index2));
cout<<“第“< cout<<“蛮力法算出最近点对距离为“< }
else if(choice == ‘2‘)
{
qsort(a n sizeof(a[0]) cmp_x);
for (i = 0; i < n; i++)
a[i].index = i;
memcpy(b a n *sizeof(a[0]));
qsort(b n sizeof(b[0]) cmp_y);
d = sqrt(closest(a b c 0 n - 1));
cout <<“分治法算出最近点对距离为“< }
else if(choice == ‘3‘)
break;
else cout<<“选择错误,请重新选择“;
}while(choice!=‘3‘);
cout<<“是否结束程序结束结束请按n继续请按任意键“< cin>>choice2;
}while( choice2!=‘n‘ ) ;
return 0;
}
int ClosestPoints(int nPoint a[]int &index1int &index2)//蛮力法
{
int ijd;
int minDist=60000;
for(i=1;i for(j=i+1;j<=n;j++)
{
d=(a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y);
if(d {minDist=d;
index1=i;
index2=j;
}
}
return minDist;
}
double closest(Point a[] Point b[] Point c[] int p int q)//分治法
{
if (q - p == 1)
return dis(a[p] a[q]);
if (q - p == 2)
{
double x1 = dis(a[p] a[q]);
double x2 = dis(a[p + 1] a[q]);
double x3 = dis(a[p] a[p + 1]);
if (x1 < x2 && x1 < x3)
return x1;
else if (x2 < x3)
return x2;
else
return x3;
}
int m = (p + q) / 2;
int i j k;
double d1 d2;
for (i = p j = p k = m + 1; i <= q; i++)
if (b[i].index <= m)
c[j++] = b[i];
//数组c左半部保存划分后左部的点 且对y是有序的.
else
c[k++] = b[i];
d1 = closest(ac b p m);
d2 = closest(a cb m + 1 q);
double dm = min(d1 d2);
merge(b c p m q); //数组c左右部分分别是对y坐标有序的 将其合并到b.
for (i = p k = p; i <= q; i++)
if (fabs(b[i].x - b[m].x) < dm)
c[k++] = b[i];
//找出离划分基准左右不超过
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 82944 2009-10-29 18:00 最近点对问题\Debug\vc60.idb
文件 110592 2009-10-29 17:56 最近点对问题\Debug\vc60.pdb
文件 598099 2009-10-29 17:56 最近点对问题\Debug\test1.exe
文件 1147904 2009-10-29 17:56 最近点对问题\Debug\test1.pdb
文件 2034296 2009-10-29 00:51 最近点对问题\Debug\test1.pch
文件 274678 2009-10-29 17:56 最近点对问题\Debug\test1.obj
文件 829568 2009-10-29 17:56 最近点对问题\Debug\test1.ilk
文件 244 2009-10-29 18:00 最近点对问题\test1.plg
文件 5118 2009-10-24 18:25 最近点对问题\test1.vcproj
文件 1427 2009-10-24 18:25 最近点对问题\test1.vcproj.KURORO-4B2C31F7.kuroro.user
文件 2560 2009-10-24 18:26 最近点对问题\test1.suo
文件 41984 2009-10-29 18:00 最近点对问题\test1.ncb
文件 3389 2009-10-29 17:42 最近点对问题\test1.dsp
文件 4436 2009-10-29 17:56 最近点对问题\test1.cpp
文件 48640 2009-10-29 18:00 最近点对问题\test1.opt
文件 518 2009-10-29 18:00 最近点对问题\test1.dsw
目录 0 2009-10-24 17:27 最近点对问题\Debug
目录 0 2009-10-24 17:27 最近点对问题
----------- --------- ---------- ----- ----
5186397 18
- 上一篇:全志驱动包.zip
- 下一篇:一种基于单片机的正弦波输出逆变电源的设计
评论
共有 条评论