求最近点对 栈溢出问题 杭电1007

ChampionLai ZJU 学生  2011-08-31 03:15:10
我在做杭电1007的时候,先把握代码贴上来!
http://acm.hdu.edu.cn/showproblem.php?pid=1007
#include<iostream.h>
#include<cmath>
#include<algorithm>
#include<iomanip>
using namespace std;

#define max 100005//100000

struct Point
{
double x;
double y;
}p[max];

double Max(double a,double b)
{
if(a<b)
return b;
return a;
}
double Min(double a,double b)
{
if(a<b)
return a;
return b;
}

//Point p[max];
class ClosetPoint
{
private:
//保存点
int num;
public:
void Input(int iCount);//传进一个要输入的顶点数目iCount
// bool cmp_x(const Point& a,const Point& b);//比较排序
// bool cmp_y(Point a,Point b);
double Seprate(int start,int end);//分治
double Merge(double curmin,int start,int end);
double Distance(Point a,Point b);
};

/*bool ClosetPoint::*/cmp_x(Point a, Point b)
{
if(a.x!=b.x)
return a.x<b.x;
else
return a.y<b.y;
}

/*bool ClosetPoint::*/cmp_y(Point a,Point b)
{
if(a.y!=b.y)
return a.y<b.y;
else
return a.x<b.x;
}

void ClosetPoint::Input(int iCount)//接受输入的顶点信息
{

num =iCount;
for(int i =0;i<iCount;i++)
cin>>p[i].x>>p[i].y;
sort(p,p+num,cmp_x);
}

double ClosetPoint::Distance(Point a,Point b)
{
return sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
}

double ClosetPoint::Seprate(int start,int end)//分治的起始位置
{
if(end-start==1)
return Distance(p[start],p[end]);
else if(end-start==2)
{
double temp1=Distance(p[start],p[start+1]);
double temp2=Distance(p[start],p[end]);
double temp3=Distance(p[start+1],p[end]);
double temp= Max(temp1,temp2);
return Max(temp,temp3);
}

int mid =(start+end)/2;
double dlm=Seprate(start,mid);
double drm=Seprate(mid+1,end);

return Min(dlm,drm);
}

double ClosetPoint::Merge(double curmin,int start,int end)
{
Point Yp[max];
int mid = (start+end)/2;
int j=0;
for(int s=0;s<num;s++)
{
if(fabs(p[s].x-p[mid].x)<=curmin)
{
Yp[j].x=p[s].x;
Yp[j++].y=p[s].y;
}
}
sort(Yp,Yp+j,cmp_y);
for(int i=0;i<j;i++)
{
for(int k=i+1;k<i+7&&k<j;k++)
{
if(Distance(Yp[i],Yp[k])<curmin)
{
curmin = Distance(Yp[i],Yp[k]);
}
}
}
return curmin;
}

int main()
{
ClosetPoint cp;
int iCount;
while(cin>>iCount)
{
if(iCount==0)
break;
cp.Input(iCount);
double curmin = cp.Seprate(0,iCount-1);
double min = cp.Merge(curmin,0,iCount-1);
// cout<<fixed<<setprecision(2)<<min<<endl;
cout.precision(2);
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout<<min/2<<endl;
}
/* Point p1,p2;
p1.x=0;
p1.y=0;
p2.x=1;
p2.y=1;
cout<<cp.Distance(p1,p2)<<endl; //test Distance method*/
return 0;
}

如果我把max改为10000则一切正常,把max改为100000怎,运行时错误,报错时说栈溢出!求牛人帮忙解决一下!谢谢啊!
...全文
142 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Zeroins 2011-09-02
软件运行时栈容量是固定的,如在某些函数内定义的局部变量(包括类对象)所占空间过大,执行到这些函数时,就可能出现运行时错误
解决方法:
<1>通过new或者malloc或使用API在内存堆中分配,记得不用时要销毁
<2>使用CreateFileMapping和MapViewOfFile映射内存文件的方式分配空间,同样不用时要反映射
回复
AndyZhang 2011-09-02
申请别忘了释放
回复
zhangqinhappy 2011-09-02
[Quote=引用 3 楼 zeroins 的回复:]
软件运行时栈容量是固定的,如在某些函数内定义的局部变量(包括类对象)所占空间过大,执行到这些函数时,就可能出现运行时错误
解决方法:
<1>通过new或者malloc或使用API在内存堆中分配,记得不用时要销毁
<2>使用CreateFileMapping和MapViewOfFile映射内存文件的方式分配空间,同样不用时要反映射
[/Quote]
+++
回复
superarhow 2011-09-02
double ClosetPoint::Merge(double curmin,int start,int end)
{
Point Yp[max];

改成:
------------------->
Point* Yp = new Point[max];
记得最后别忘记delete Yp[];哦亲
回复
zhanshen2891 2011-08-31
精满自溢
回复
PG 2011-08-31
就是栈溢出嘛,有啥好说的,改小点不就行了。
回复
相关推荐
发帖
其它技术问题
创建于2007-09-28

3849

社区成员

C/C++ 其它技术问题
申请成为版主
帖子事件
创建了帖子
2011-08-31 03:15
社区公告
暂无公告