| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 614 人关注过本帖
标题:求助,分治算法最近点对问题
取消只看楼主 加入收藏
索大
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2013-4-23
收藏
 问题点数:0 回复次数:0 
求助,分治算法最近点对问题
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

struct point
{
    double x , y;
}p[100005];

int a[100005];    //保存筛选的坐标点的索引

int cmpx(const point &a , const point &b)
{
    return a.x < b.x;
}
int cmpy(int &a , int &b)    //这里用的是下标索引
{
    return p[a].y < p[b].y;
}
inline double dis(point &a , point &b)
{
    return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
}
inline double min(double a , double b)
{
    return a < b ? a : b;
}

double closest(int low , int high)
{
    if(low + 1 == high)
        return dis(p[low] , p[high]);
    if(low + 2 == high)
        return min(dis(p[low] , p[high]) , min( dis(p[low] , p[low+1]) , dis(p[low+1] , p[high]) ));
    int mid = (low + high)>>1;
    double ans = min( closest(low , mid) , closest(mid + 1 , high) );    //分治法进行递归求解
    int i , j , cnt = 0;
    for(i = low ; i <= high ; ++i)   //把x坐标在p[mid].x-ans~p[mid].x+ans范围内的点取出来
    {
        if(p[i].x >= p[mid].x - ans && p[i].x <= p[mid].x + ans)
            a[cnt++] = i;       //保存的是下标索引
    }
    sort(a , a + cnt , cmpy);   //按y坐标进行升序排序  
    for(i = 0 ; i < cnt ; ++i)
    {
        for(j = i+1 ; j < cnt ; ++j)
        {
            if(p[a[j]].y - p[a[i]].y >= ans)   //注意下标索引
                break;
            ans = min(ans , dis(p[a[i]] , p[a[j]]));
        }
    }
    return ans;
}
int main(void)
{
    int i,n;
    while(scanf("%d",&n) != EOF)
    {
        if(!n)
            break;
        for(i = 0 ; i < n ; ++i)
            scanf("%lf %lf",&p[i].x,&p[i].y);
        sort(p , p + n , cmpx);
        printf("%.2lf\n",closest(0,n-1)/2);  
    }
    return 0;
}

有人能帮我把这段代码改成C语言吗?或者用另外的代码
我自己改的代码出错~~
搜索更多相关主题的帖子: include namespace double return 
2013-04-23 17:07
快速回复:求助,分治算法最近点对问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018620 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved