DRAWRECT 질문입니다.

  • User Avatar
    sstzz

    문제를 해결하기 위한 제 알고리즘은 다음과 같습니다.

    1) 0~3까지 각 꼭지점을 Indexing한다. 답은 3에 해당하는 점이다.
    2) 변끼리 평행하다는 것이 보장되 있으므로 평행한 변 끼리의 차는 같다고 한다.
    3) 위 수식을 계산하기 앞서 주어진 점중 대각선에 위치한 두 점을 구한다. 총 3개의 점이므로 $3C2$ 만큼 비교하면 되므로 총 3번 비교한다.
    4) 3 가지 경우 각각의 x, y 좌표를 구한다. 차는 절대값으로 두었다.

    다음은 코드입니다.

    ~~~c++
    #include
    #include
    using namespace std;
    class drawRect{
    public:
    drawRect(){
    for(int i =0 ;i<=3;i++){
    rect_x[i]=0;
    rect_y[i]=0;
    }
    }
    void inputRect(){
    for(int i= 0; i<=2;i++) {
    cin >> rect_x[i] >> rect_y[i];

    }
    }

        int findDiag(){    // 대각선에 위치한 좌표끼리의 차는 0이 아니라는 성질을 이용해 해당좌표의 index의 합을 리턴합니다.
            if(((rect_x[1] - rect_x[0]) !=0) && ((rect_y[1] - rect_y[0]) != 0)){
                return 1;
            }
            else if(((rect_x[2] - rect_x[1]) !=0) && ((rect_y[2] - rect_y[1]) != 0)){
                return 3;
            }
            else {   // 0과 2에 해당하는 좌표가 서로 대각에 위치할 때 입니다.
                return 2;
            }
        }
    
        void findAnsw(int index){
    
            switch (index){
                case 1:
                    rect_x[3] = abs(rect_x[0] - rect_x[2]) + rect_x[1];  // 0과 1에 해당하는 좌표가 서로 대각선에 위치하므로 마주보는 변의 길의는 같다고 두고 변수를 구합니다.
                    rect_y[3] = abs(rect_y[0] - rect_y[2]) + rect_y[1];  // 마찬가지로 y좌표도 구합니다.
                    break;
                case 2:
                    rect_x[3] = abs(rect_x[1] - rect_x[0]) + rect_x[2];
                    rect_y[3] = abs(rect_y[1] - rect_y[0]) + rect_y[2];
                    break;
                case 3:
    
                    rect_x[3] = abs(rect_x[0] - rect_x[1]) + rect_x[2];
                    rect_y[3] = abs(rect_y[0] - rect_y[1]) + rect_y[2];
                    break;
            }
        }
        void printAnsw(){
            cout<<rect_x[3]<<" "<<rect_y[3]<<endl; // 출력합니다.
        }
        void clearRect(){
            for(int i = 0 ;i<=3;i++){
                rect_x[i]=0;
                rect_y[i]=0;
            }
        }
    
    private:
        int rect_x[4];  // x좌표의 모음입니다. 4번째 좌표는 정답에 해당하는 좌표입니다.
        int rect_y[4];  // y좌표의 모음입니다.
    

    };

    int main(){
    int t;
    cin >> t;
    drawRect rect1;
    while(t--){
    rect1.inputRect();
    rect1.findAnsw(rect1.findDiag());
    rect1.printAnsw();
    rect1.clearRect();
    }
    return 0;
    }
    ~~~

    어디가 오류인지 아무리봐도 모르겠습니다.


    12년 전
1개의 댓글이 있습니다.
  • User Avatar
    샥후

    findAnsw내에 식에 문제가 있어보입니다.
    0,1번 점이 입력시 순서가 바뀌어도 답이 같아야 합니다.


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