윈도 매니저

아직 제출이 없습니다시간 제한2초메모리 제한256 MB

문제

터치 화면이 널리 쓰이면서 컴퓨터를 다루는 방식이 달라졌다. 터치 인터페이스에서 자주 쓰는 착상 하나는 화면 위의 물체가 물리 법칙을 따르는 것처럼 움직이게 만드는 것이다. 이 문제에서 그 예를 구현한다.

휴대폰 윈도 매니저 시뮬레이터를 만들어야 한다. 화면은 직사각형이고 직사각형 윈도를 0개 이상 완전히 담는다. 어떤 윈도도 화면 경계를 넘지 않고, 두 윈도가 서로 겹치지도 않는다. 시뮬레이터는 명령 네 가지를 지원한다.

  • OPEN x y w h: 왼쪽 위 모서리가 (x,y)(x, y)이고 너비가 ww 픽셀, 높이가 hh 픽셀인 윈도를 새로 연다.
  • CLOSE x y: 픽셀 (x,y)(x, y)를 포함하는 윈도를 닫는다. 사용자는 윈도의 아무 곳이나 두드려서 닫을 수 있다.
  • RESIZE x y w h: 픽셀 (x,y)(x, y)를 포함하는 윈도의 크기를 너비 ww, 높이 hh로 바꾼다. 왼쪽 위 모서리는 움직이지 않는다.
  • MOVE x y dx dy: 픽셀 (x,y)(x, y)를 포함하는 윈도를 가로로 dxdx 픽셀 또는 세로로 dydy 픽셀 옮긴다. dxdxdydy 중 0이 아닌 값은 많아야 하나다.

OPENRESIZE는 결과로 생기는 윈도가 다른 윈도와 겹치지 않고 화면 안에 그대로 들어갈 때만 성공한다. MOVE는 요청한 픽셀 수만큼 최대한 옮긴다. dxdx가 30인데 오른쪽으로 15픽셀만 갈 수 있다면 15픽셀만 간다.

옮기는 윈도가 다른 윈도에 부딪히면 그 윈도를 같은 방향으로 필요한 만큼 밀어낸다. 실제 물체가 부딪히는 것과 같다. 밀린 윈도가 또 다른 윈도를 만나면 그 윈도도 함께 밀린다. 그림 1은 윈도가 세 개 있는 상황에서 윈도 A를 오른쪽으로 옮겨 나머지 둘을 함께 미는 모습이다.

윈도 A가 오른쪽으로 움직이면서 나머지 두 윈도를 미는 모습

그림 1: 윈도를 두 개 미는 MOVE

입력

첫째 줄에 화면의 가로 크기 xmaxx_{max}와 세로 크기 ymaxy_{max}가 픽셀 단위 양의 정수로 주어진다. 둘 다 10910^9 이하다. 화면의 왼쪽 위 픽셀 좌표는 (0,0)(0, 0)이다.

다음 줄부터 위에서 설명한 명령이 한 줄에 하나씩 주어진다. 명령 이름과 인자는 공백 하나 이상으로 구분한다. 인자는 모두 정수이고 0x<xmax0 \le x < x_{max}, 0y<ymax0 \le y < y_{max}, 1w,h1091 \le w, h \le 10^9, dx,dy109|dx|, |dy| \le 10^9을 만족한다. 명령은 많아야 256개다.

출력

명령을 입력에 나온 순서대로 시뮬레이션한다. 명령 번호는 1부터 센다. 명령을 시뮬레이션하다가 오류가 생기면 명령 번호와 명령 이름, 그리고 아래 목록에서 처음으로 들어맞는 메시지를 한 줄에 출력하고, MOVE의 예외를 빼면 그 명령의 결과는 반영하지 않는다. 형식은 다음과 같다.

Command N: NAME - message
  • no window at given position: CLOSE, RESIZE, MOVE에서 주어진 위치를 포함하는 윈도가 없을 때.
  • window does not fit: OPEN, RESIZE에서 결과로 생기는 윈도가 다른 윈도와 겹치거나 화면 경계를 넘을 때.
  • moved d' instead of d: MOVE에서 윈도를 dd 픽셀 옮기라고 했지만, 어떤 윈도가 화면 경계를 넘어야 하는 상황이 되기 전까지 dd' 픽셀만 옮길 수 있었을 때. dddd'은 각각 요청한 거리와 실제로 옮긴 거리의 절댓값이다. 이때도 윈도는 더 짧은 거리만큼 실제로 움직인다.

명령을 모두 시뮬레이션하고 오류 메시지를 모두 출력한 뒤, 아직 열려 있는 윈도의 개수 kk를 다음 형식으로 출력한다.

k window(s):

그 다음 열린 순서대로 윈도마다 한 줄씩, 왼쪽 위 모서리의 좌표 xxyy, 너비, 높이를 공백 하나로 구분해 출력한다.