남극기지 문제.. 도와주세요!

  • dx1122
    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일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.