닫기버튼


상단 배너 영역


실시간댓글

[일반] 프로그래밍주의)코드 어디가 잘못됬는지 좀 봐주실분..

비쿠nin | 2014-11-19 16:59

762963_1416383905.png 

결과값 중에서 저렇게 음수로 존나 노답으로 뜨는데 이거 어디가 잘못됬는지 모르겠음 ㅠㅠㅠ

 

 

이건 코드

 

#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);
}

 

 

 

 

nlv0
gold

0

point

0

프로필 숨기기

0

0%

최신순

게임조선 회원님들의 의견 (총 13개) ※ 새로고침은 5초에 한번씩 실행 됩니다.

새로고침

신고

댓글 삭제

비쿠nin 작성자 2014-11-19 17:00 0

코드 올리고 나니 읽기존나 힘드네 --

신고

댓글 삭제

트폿 작성자 2014-11-19 17:01 0

이렇게 질문하면 답하기도 싫어진다

신고

nlv100_6985565 비쿠닌 2014-11-19 17:01 0

인정

신고

nlv201_0101 월현콩 2014-11-19 17:02 0

보기가 너무 힘들다

신고

댓글 삭제

비쿠nin 작성자 2014-11-19 17:08 0

아 브루트 포스 함수쪽에서 for문 범위 시작을 0이 아니라 left로 해야하는구나..

잘못된게 브루트포스쪽에서 일어난거라 이쪽 고쳐보니 정상적으로 뜸..

신고

nlv201_0101 월현콩 2014-11-19 17:11 0

봤는데

if(d1>d2)
if(d1<d3) {..dd=d1;}
else {..dd=d3;}
else if(d2<d1)
if(d2<d3)  {.. dd=d2;}
else {... dd=d3; }

이 정체불명의 코드에서 d1이랑 d2가 같을땐 dd값이 세팅이 안됨. 그니까 저런 쓰레기값이 출력되는거

그리고 또 이해가 안되는건. 제일 작은 값을 찾는것 같은데.. 첫번째 조건에서 d1>d2인데.. 밑에 else if 도 d2<d1임

똑같은거 아님? 첫째줄 if문은 d1<d2로 들어가야함

신고

nlv100_6985565 비쿠닌 2014-11-19 17:12 0

일단부등호는바꿈

신고

nlv201_0101 월현콩 2014-11-19 17:12 0

차라리
if(d1<d2)
--if(d1<d3)
--else
else
--if(d2<d3)
--else

이렇게 가야죠

신고

nlv24 [우유조아] 2014-11-19 17:12 0

몇학년임?

신고

nlv100_6985565 비쿠닌 2014-11-19 17:14 0

배운지 반년도안됨

따로배우는거라

신고

nlv100_6985565 비쿠닌 2014-11-19 17:16 0

월천콩님 감사합니당ㅜㅜ

신고

nlv24 [우유조아] 2014-11-19 17:19 0

따로 공부하다니 꿈같은 일이다

신고

nlv64 정장의까마귀 2014-11-19 17:30 0

cpr떴다 응급이다..

0/500자

목록 글쓰기 위로 로그인


게임조선 소개및 약관