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

  • User Avatar
    dx1122

    입력된 좌표 값을 받아 좌표 값에 따른 인접행렬을 만들고,

    최소 거리를 계산할 때 최소 거리 변수를 두어
    0번 기지에서 시작하여 가장 짧은 거리를 선택하고 최소 거리보다 클 경우에만 그 차이를 최소 거리에 업데이트 하도록 하였습니다.

    실행하면 값은 잘 나오는데 왜 오답인지 모르겠네요 ㅠㅠ
    소스 첨부합니다.

    (C로 코딩하려다 평소처럼 C++ 명령어들을 사용하여 코드가 뒤죽박죽 됐네요ㅠㅠ..)


    ~~~ c++
    #include

    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;
    

    }

    </spoiler>
    

    10년 전
0개의 댓글이 있습니다.
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.