Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 페이지를 특정 각도로 회전할 수 있는지 판별하는 방법

문제 개요

이 문제에서는 페이지 위에 놓인 세 점 x, y, z의 좌표가 주어집니다. 우리의 목표는 페이지를 특정 각도로 회전할 수 있는지 판별하는 것입니다.

여기서 말하는 회전은 다음과 같이 정의됩니다. 회전 후 점 'x'의 위치는 회전 전 'y'의 위치가 되고, 점 'y'의 위치는 회전 전 'z'의 위치가 됩니다. 회전 가능 여부에 따라 "Yes" 또는 "No"를 출력하면 됩니다.

예제로 문제 이해하기

입력: x = (0, 1), y = (1, 0), z = (0, -1)

출력: Yes

설명:

C++로 페이지를 특정 각도로 회전할 수 있는지 판별하는 방법

위 예제에서는 페이지를 90도 회전하면 점 x가 점 y의 원래 자리로, 점 y가 점 z의 원래 자리로 이동하므로 회전이 가능합니다.

해결 접근 방법

페이지를 회전할 수 있으려면 다음 조건들이 만족되어야 합니다.

  • 거리 조건: 점 x와 y 사이의 거리가 점 y와 z 사이의 거리와 같아야 합니다. 회전은 길이를 보존하는 변환이므로 인접한 두 구간의 길이가 동일해야 합니다.
  • 일직선 조건: 세 점이 모두 한 직선 위에 있다면 회전이 불가능합니다. 즉, y가 x와 z의 중점이라면 회전할 수 없습니다.

이 두 조건을 검사하여 모두 통과하면 "Yes", 하나라도 실패하면 "No"를 출력하면 됩니다.

솔루션 구현 코드

#include<bits/stdc++.h>
using namespace std;

int possibleOrNot(int coordinates[3][2]){
   
   long long dis1 = pow(coordinates[1][0] - coordinates[0][0], 2) + pow(coordinates[1][1] - coordinates[0][1], 2);
   long long dis2 = pow(coordinates[2][0] - coordinates[1][0], 2) + pow(coordinates[2][1] - coordinates[1][1], 2);

   if(dis1 != dis2)
      return 0;
   else if (coordinates[1][0] == ((coordinates[0][0] + coordinates[2][0]) / 2.0) && coordinates[1][1] == ((coordinates[0][1] + coordinates[2][1]) / 2.0))
      return 0;
   else
      return 1;
}

int main() {
   
   int coordinates[3][2] = {{0 , 1}, {1 , 0}, {0, -1} } ;
   if ( possibleOrNot(coordinates))
      cout<<"The rotation of page is possible";
   else
      cout<<"The rotation of page is not possible";
   
   return 0;
}

코드 설명

  • dis1은 점 x와 y 사이 거리의 제곱, dis2는 점 y와 z 사이 거리의 제곱입니다. 제곱 값을 비교하면 루트 연산 없이도 거리를 비교할 수 있어 오차를 줄일 수 있습니다.
  • 두 거리가 다르면 회전이 불가능하므로 0을 반환합니다.
  • y의 좌표가 x와 z 좌표의 평균값(중점)과 같다면 세 점이 일직선상에 있다는 의미이므로 역시 0을 반환합니다.
  • 위 조건들을 모두 통과하면 회전이 가능하므로 1을 반환합니다.

출력 결과

The rotation of page is possible