
실시간댓글
|
|
비쿠nin | 2014-11-19 16:59
결과값 중에서 저렇게 음수로 존나 노답으로 뜨는데 이거 어디가 잘못됬는지 모르겠음 ㅠㅠㅠ
이건 코드
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
double dist(int x1,int x2,int y1,int y2)
{
double d;
int a=x1-x2;
int b=y1-y2;
d=sqrt(double((a*a)+(b*b)));
return d;
}
double cp_brote_force(int x[],int y[],int left,int right,int p[],int q[])
{
double d=0.0, min_d=5550000;
int i,j;
for(i=0;i<right;i++)
for(j=i+1;j<right;j++)
{
d=dist(x[i],x[j],y[i],y[j]);
if(d>=min_d) continue;
p[0]=x[i];q[0]=y[i];
p[1]=x[j];q[1]=y[j];
min_d=d;
}
return min_d;
}
double closest_pair(int x[],int y[],int left,int right, int p[],int q[])
{
int cpLX[2]={0},cpLY[2]={0},cpRX[2]={0},cpRY[2]={0},cpCX[2]={0},cpCY[2]={0};
if(left<right)
{
if((right-left+1)<= 3)
return cp_brote_force(x,y,left,right,p,q);
int mid =(right+left)/2;
double d1=closest_pair(x,y,left,mid,p,q);
memcpy(cpLX,p,8); memcpy(cpLY,q,8);
double d2=closest_pair(x,y,mid+1,right,p,q);
memcpy(cpRX,p,8); memcpy(cpRY,q,8);
double d=(d1>d2) ? d2:d1;
int i,j;
for (i=mid;x[i]>=(x[mid]-d) && i>left;--i);
if(x[i]<(x[mid]-d)) ++i;
for(j=mid+1;x[j]<=(x[mid]+d)&& j<right;++j);
if(x[j]>(x[mid]+d)) --j;
double d3=cp_brote_force(x,y,i,j,p,q);
memcpy(cpCX,p,8); memcpy(cpCY,q,8);
double dd;
if(d1>d2)
if(d1<d3) {memcpy(p,cpLX,8); memcpy(q,cpLY,8);dd=d1;}
else {memcpy(p,cpCX,8); memcpy(q,cpCY,8);dd=d3;}
else if(d2<d1)
if(d2<d3) {memcpy(p,cpRX,8); memcpy(q,cpRY,8); dd=d2;}
else {memcpy(p,cpCX,8); memcpy(q,cpCY,8); dd=d3; }
printf("\tCPL:%.0lf CPR:%.0lf CPC:%.0lf\n",d1,d2,d3);
printf("\t---->selected coordinate: (%d,%d), (%d,%d), distance:%.0lf \n",cpCX[0],cpCY[0],cpCX[1],cpCY[1],dd);
return dd;
}
return 0.0;
}
void main()
{
int x[10]={1,6,9,12,20,25,33,66,88,125};
int y[10]={28,123,66,3,19,56,91,44,111,1};
int p[2]={0},q[2]={0};
int size=sizeof(x)/sizeof(int);
printf("입력 좌표값 출력-----------------------------------\n");
for (int i=0;i<size;i++)
{
printf("(%d,%d) ",x[i],y[i]);
if(i ==(size/2-1)) printf("\n\t");
}
printf("\n----------------------------------------------\n");
double min_d=cp_brote_force(x,y,0,size-1,p,q);
printf("Closest Pair:(%d,%d),(%d,%d),dist: %.0lf <--brote_force\n",p[0],q[0],p[1],q[1],min_d);
min_d=closest_pair(x,y,0,size-1,p,q);
printf("Closest Pair:(%d,%d),(%d,%d),dist:%.0lf <--cp\n",p[0],q[0],p[1],q[1],min_d);
}
0
0
프로필 숨기기
0%