남극기지 문제.. 도와주세요! dx1122 입력된 좌표 값을 받아 좌표 값에 따른 인접행렬을 만들고, 최소 거리를 계산할 때 최소 거리 변수를 두어 0번 기지에서 시작하여 가장 짧은 거리를 선택하고 최소 거리보다 클 경우에만 그 차이를 최소 거리에 업데이트 하도록 하였습니다. 실행하면 값은 잘 나오는데 왜 오답인지 모르겠네요 ㅠㅠ 소스 첨부합니다. (C로 코딩하려다 평소처럼 C++ 명령어들을 사용하여 코드가 뒤죽박죽 됐네요ㅠㅠ..) #include <iostream> typedef struct _Coord { double x, y; } Coord; typedef struct _AntBase { Coord * base; int nBaseNum; double dMinDist; void init(int n) { nBaseNum = n; base = new Coord[nBaseNum]; } } AntBase; int g_preVisit[100]; double calcDistance(Coord coord1, Coord coord2); double sySqrt(double x); double detectMinDist(double dPredist, int nIndex, double * distMap, int nSize, int& nOutputIdx); int main() { int nTestNum; scanf("%d", &nTestNum); AntBase* AntracBase = new _AntBase[nTestNum]; for (int i = 0; i < nTestNum; ++i) { int nBaseNum; scanf("%d", &nBaseNum); AntracBase[i].init(nBaseNum); double ** distMat = new double *[nBaseNum]; for (int j = 0; j < nBaseNum; ++j) { distMat[j] = new double[nBaseNum]; scanf("%lf %lf", &AntracBase[i].base[j].x, &AntracBase[i].base[j].y); } ////////////////////////////////////////////////////////////////////////// for (int j = 0; j < nBaseNum; ++j) { for (int k = 0; k < nBaseNum; ++k) { double dist = calcDistance(AntracBase[i].base[j], AntracBase[i].base[k]); distMat[j][k] = dist;// = distMat[k][j] = dist; } } /* for (int j = 0; j < nBaseNum; ++j) { for (int k = 0; k < nBaseNum; ++k) { printf("%.2lf ", distMat[j][k]); } printf("\n"); } */ ////////////////////////////////////////////////////////////////////////// double dPreDist = 0.; int nOutputIdx = 0; for (int j = 0; j < nBaseNum; ++j ) { g_preVisit[j] = -1; } for (int j = 0; j < (nBaseNum - 1); ++j ) { double dDiffer = detectMinDist(dPreDist, nOutputIdx, distMat[nOutputIdx], nBaseNum, nOutputIdx); dPreDist += dDiffer; g_preVisit[j] = nOutputIdx; } AntracBase[i].dMinDist = dPreDist; } ////////////////////////////////////////////////////////////////////////// for (int i = 0; i < nTestNum; ++i) { printf("%.2lf \n", AntracBase[i].dMinDist); } return 0; } double calcDistance(Coord coord1, Coord coord2) { double x_2 = (coord1.x - coord2.x)*(coord1.x - coord2.x); double y_2 = (coord1.y - coord2.y)*(coord1.y - coord2.y); double dDistance = sySqrt((x_2 + y_2)); return dDistance; } double sySqrt(double dInput) { double doutput = 1; for (int i = 0; i < 20; ++i) doutput = (doutput + (dInput / doutput)) / 2.; return doutput; } double detectMinDist(double dPredist, int nIndex, double * distMap, int nSize, int& nOutputIdx) { double dMindist = 100000; for (int i = 0; i < nSize; ++i) { bool bPreVisit = false; for (int j = 0; j < nSize; ++j) { if (g_preVisit[j] == i) { bPreVisit = true; } } if ( (i == nIndex) || (bPreVisit) ) { continue; } if ( distMap[i] < dMindist ) { dMindist = distMap[i]; nOutputIdx = i; } } double dDiffer = dPredist - dMindist; if (dDiffer < 0) dDiffer *= -1; if (dPredist >= dMindist) dDiffer = 0.; return dDiffer; } 8년 전
0개의 댓글이 있습니다. 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
dx1122
입력된 좌표 값을 받아 좌표 값에 따른 인접행렬을 만들고,
최소 거리를 계산할 때 최소 거리 변수를 두어
0번 기지에서 시작하여 가장 짧은 거리를 선택하고 최소 거리보다 클 경우에만 그 차이를 최소 거리에 업데이트 하도록 하였습니다.
실행하면 값은 잘 나오는데 왜 오답인지 모르겠네요 ㅠㅠ
소스 첨부합니다.
(C로 코딩하려다 평소처럼 C++ 명령어들을 사용하여 코드가 뒤죽박죽 됐네요ㅠㅠ..)
8년 전