
用C++写的分治算法求最近点对的问题,求高手解答! 出错提示:访问冲突 30
源代码如下:doubleDistance(Pointp1,Pointp2){//求距离函数,参数:要求距离的两个点(结构体)doublesqaurtX=(p1.x-p2....
源代码如下:
double Distance(Point p1,Point p2){//求距离函数,参数:要求距离的两个点(结构体)
double sqaurtX=(p1.x - p2.x)*(p1.x - p2.x);
double sqaurtY=(p1.y - p2.y)*(p1.y - p2.y);
return sqrt(sqaurtX+sqaurtY);
}
double ForceShortestPair(Points *cPoints,Point *p1,Point *p2,int n){//蛮力算法,传入点集数组的首地址和点的个数,p1、p2是最近的两个点的坐标
double dis=Distance(cPoints->curPoint[0],cPoints->curPoint[1]);
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++){
dis=Distance(cPoints->curPoint[i],cPoints->curPoint[j]) < dis ? Distance(cPoints->curPoint[i],cPoints->curPoint[j]):dis;
p1=cPoints->curPoint;
p2=cPoints->curPoint;
}
return dis;
}
void sortX(Points *cPoints){//排序
Point t;
for(int i=0;i<cPoints->n-1;i++)
for(int j=0;j<cPoints->n-i;j++){
if(cPoints->curPoint[j].x > cPoints->curPoint[j+1].x){
t.x = cPoints->curPoint[j].x; t.y=cPoints->curPoint[j].y;
cPoints->curPoint[j].x=cPoints->curPoint[j+1].x; cPoints->curPoint[j].y=cPoints->curPoint[j+1].y;
cPoints->curPoint[j+1].x=t.x;cPoints->curPoint[j+1].y=t.y;
}
}
}
int ShortestDistDC(Points *cPoints,Point *p1,Point *p2,int num){//分治算法 传入数组首地址和点个数,返回最近两点的坐标
double dis=NULL,dL,dR;
if(num<2)return 0;
if(num<4)
return (int)ForceShortestPair(cPoints,p1,p2,num);
sortX(cPoints);//排序
int mid=(num+1)/2;//中点
dL=ShortestDistDC(cPoints,p1,p2,mid);//左区
dR=ShortestDistDC(cPoints+mid,p1,p2,num-mid);//右区
dis =(dL < dR ? dL : dR);
int midX=cPoints->curPoint[mid].x;
int stripStart = 0;
int stripEnd = num-1;
for (int i=0; i<num-1; i++)//合并分区,比较分区界附近点对距离
{
if ( (cPoints->curPoint[i].x < midX-dis) && (cPoints->curPoint[i+1].x >= midX-dis) )
stripStart = i+1;
if ( (cPoints->curPoint[i].x <= midX+dis) && (cPoints->curPoint[i+1].x > midX+dis) )
stripEnd = i;
}
for (int i=stripStart; i<stripEnd; i++)
{
for (int j=i+1; j<stripEnd; j++)
{
if ( Distance(cPoints->curPoint[i], cPoints->curPoint[j]) < dis )
{
dis = Distance(cPoints->curPoint[i], cPoints->curPoint[j]);
}
}
}
return (int)dis; //返回距离
出错提示:求最近点对.exe 中的 0x00d81703 处有未经处理的异常: 0xC0000005: 读取位置 0x0000000c 时发生访问冲突
我自己找到问题了,
因为这一句:
dR=ShortestDistDC(cPoints+mid,p1,p2,num-mid);//右区
传进的分别是:指向坐标结构体的地址,点p1,点p2(为了返回最近的两点坐标),点的个数
每一次递归调用时,都将右端起始位置地址后延“mid”个数据,以致越界
所以,将传入的地址改为数组的地址cPoints->Point[...],并将其他部分做相应改变即可. 展开
double Distance(Point p1,Point p2){//求距离函数,参数:要求距离的两个点(结构体)
double sqaurtX=(p1.x - p2.x)*(p1.x - p2.x);
double sqaurtY=(p1.y - p2.y)*(p1.y - p2.y);
return sqrt(sqaurtX+sqaurtY);
}
double ForceShortestPair(Points *cPoints,Point *p1,Point *p2,int n){//蛮力算法,传入点集数组的首地址和点的个数,p1、p2是最近的两个点的坐标
double dis=Distance(cPoints->curPoint[0],cPoints->curPoint[1]);
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++){
dis=Distance(cPoints->curPoint[i],cPoints->curPoint[j]) < dis ? Distance(cPoints->curPoint[i],cPoints->curPoint[j]):dis;
p1=cPoints->curPoint;
p2=cPoints->curPoint;
}
return dis;
}
void sortX(Points *cPoints){//排序
Point t;
for(int i=0;i<cPoints->n-1;i++)
for(int j=0;j<cPoints->n-i;j++){
if(cPoints->curPoint[j].x > cPoints->curPoint[j+1].x){
t.x = cPoints->curPoint[j].x; t.y=cPoints->curPoint[j].y;
cPoints->curPoint[j].x=cPoints->curPoint[j+1].x; cPoints->curPoint[j].y=cPoints->curPoint[j+1].y;
cPoints->curPoint[j+1].x=t.x;cPoints->curPoint[j+1].y=t.y;
}
}
}
int ShortestDistDC(Points *cPoints,Point *p1,Point *p2,int num){//分治算法 传入数组首地址和点个数,返回最近两点的坐标
double dis=NULL,dL,dR;
if(num<2)return 0;
if(num<4)
return (int)ForceShortestPair(cPoints,p1,p2,num);
sortX(cPoints);//排序
int mid=(num+1)/2;//中点
dL=ShortestDistDC(cPoints,p1,p2,mid);//左区
dR=ShortestDistDC(cPoints+mid,p1,p2,num-mid);//右区
dis =(dL < dR ? dL : dR);
int midX=cPoints->curPoint[mid].x;
int stripStart = 0;
int stripEnd = num-1;
for (int i=0; i<num-1; i++)//合并分区,比较分区界附近点对距离
{
if ( (cPoints->curPoint[i].x < midX-dis) && (cPoints->curPoint[i+1].x >= midX-dis) )
stripStart = i+1;
if ( (cPoints->curPoint[i].x <= midX+dis) && (cPoints->curPoint[i+1].x > midX+dis) )
stripEnd = i;
}
for (int i=stripStart; i<stripEnd; i++)
{
for (int j=i+1; j<stripEnd; j++)
{
if ( Distance(cPoints->curPoint[i], cPoints->curPoint[j]) < dis )
{
dis = Distance(cPoints->curPoint[i], cPoints->curPoint[j]);
}
}
}
return (int)dis; //返回距离
出错提示:求最近点对.exe 中的 0x00d81703 处有未经处理的异常: 0xC0000005: 读取位置 0x0000000c 时发生访问冲突
我自己找到问题了,
因为这一句:
dR=ShortestDistDC(cPoints+mid,p1,p2,num-mid);//右区
传进的分别是:指向坐标结构体的地址,点p1,点p2(为了返回最近的两点坐标),点的个数
每一次递归调用时,都将右端起始位置地址后延“mid”个数据,以致越界
所以,将传入的地址改为数组的地址cPoints->Point[...],并将其他部分做相应改变即可. 展开
1个回答
展开全部
重新检查你程序中的数组使用,是否越界,还是指针指向的内存空间有问题,因为你给的是程序的片段,所以无法帮你调试运行,只能够看了之后提出建议,谢谢!
祝你成功~~~
祝你成功~~~
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询