만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

스트럿과 스프링

시간 제한2초메모리 제한1024 MB

요약
외곽 창의 크기가 바뀔 때 스트럿과 스프링 규칙에 따라 각 내부 창의 새 위치와 크기를 계산합니다.
난이도

보통10점 중 4점

유형
시뮬레이션, 구현
정답자
아직 제출이 없습니다

문제

스트럿(struts)과 스프링(springs)은 바깥 창의 크기가 바뀔 때 화면 위 직사각형 창의 크기와 위치가 어떻게 바뀔지 정하는 장치이다. 창은 화면의 직사각형 영역을 차지하며, 다른 창을 안에 포함해 창의 계층 구조를 만들 수 있다. 가장 바깥 창의 크기가 바뀌면 바로 안에 포함된 각 창은 스트럿과 스프링의 배치에 따라 위치나 크기가 바뀔 수 있다. 이 변화는 다시 그 창이 포함하는 창의 위치나 크기에 영향을 줄 수 있다.

스트럿은 개념적으로 길이가 고정된 막대이다. 창의 가로 또는 세로 변 사이, 혹은 창의 한 변과 바로 바깥 창의 대응하는 변 사이에 놓인다. 스트럿이 창의 세로 변이나 가로 변을 잇면 그 창의 높이나 너비가 고정된다. 스트럿이 창의 한 변과 바깥 창의 대응하는 변을 잇면 두 변 사이의 거리가 고정된다. 스프링은 압축되거나 늘어날 수 있으며, 스트럿 대신 쓸 수도 있다.

가장 바깥 창을 제외한 각 창에는 여섯 개의 스트럿 또는 스프링이 연결되어 있다. 하나는 창의 세로 변을 잇고, 다른 하나는 가로 변을 잇는다. 나머지 네 개는 창의 각 변과 바깥 창의 대응하는 변을 잇는다. 세로 방향의 세 부품 길이의 합은 바깥 창의 높이와 같고, 가로 방향의 세 부품 길이의 합은 바깥 창의 너비와 같다. 바깥 창의 너비가 바뀌면 창에 연결된 가로 방향 스프링은 같은 비율로 늘어나거나 줄어들어, 전체 길이의 합이 새 너비와 같아진다. 높이가 바뀔 때도 같은 방식으로 처리한다. 세로 또는 가로 방향의 세 부품이 모두 스트럿이면, 각각 맨 위 또는 맨 오른쪽 스트럿이 사실상 스프링으로 대체된다.

여러분은 여러 창의 초기 크기와 위치, 스트럿과 스프링의 배치, 그리고 가장 바깥 창의 크기 변경 요청을 입력받아, 각 요청마다 모든 창의 변경된 크기와 위치를 구하는 프로그램을 작성해야 한다. 한 창이 나머지 모든 창을 감싸는 것이 보장된다.

입력

입력은 여러 개의 테스트 케이스로 이루어지며, 각 케이스는 서로 다른 창의 집합에 대응한다. 각 테스트 케이스는 정수 nwin, nresize, owidth, oheight 네 개가 적힌 줄로 시작한다. nwin은 모든 창을 감싸는 가장 바깥 창을 제외한 창의 개수이다. nresize는 가장 바깥 창의 크기 변경 요청 횟수이다. owidth와 oheight는 가장 바깥 창의 초기 너비와 높이이다.

이어지는 nwin개의 줄에는 각각 창 하나를 나타내는 0 이상의 정수 10개가 적혀 있다. 처음 두 정수는 가장 바깥 창의 왼쪽 위 모서리를 기준으로 한 해당 창의 왼쪽 위 모서리의 초기 x, y 변위이다. 다음 두 정수는 창의 초기 너비와 높이이다. 마지막 여섯 정수는 각각 0(스트럿) 또는 1(스프링)이다. 처음 두 값은 창의 세로 변과 가로 변을 잇는 것이 스트럿인지 스프링인지를 각각 정한다. 나머지 네 값은 창의 위쪽, 아래쪽, 왼쪽, 오른쪽 변과 바로 바깥 창 사이를 잇는 것이 스트럿인지 스프링인지를 정한다.

마지막 nresize개의 줄에는 가장 바깥 창의 새 너비와 높이가 주어진다. 이것이 크기 변경 연산이다. 각 연산마다 프로그램은 nwin개의 안쪽 창 각각의 크기와 위치를 구해야 한다. 테스트 데이터는 모든 크기 변경 연산 뒤에도 모든 스트럿과 스프링의 길이가 양의 정수이고, 서로 다른 창의 경계가 맞닿지 않도록 보장한다. 또한 크기 변경으로 한 창이 다른 창의 내부로 뛰어드는 일은 없다.

한 테스트 케이스에는 창이 최대 100개, 크기 변경 연산이 최대 100개 있다. 가장 바깥 창의 너비와 높이는 1,000,000을 넘지 않는다. 마지막 테스트 케이스 뒤에는 0이 네 개 적힌 줄이 온다.

출력

각 테스트 케이스의 크기 변경 연산마다, Case k, resize operation j: 형식의 줄을 출력한다. k는 테스트 케이스 번호(1부터 시작)이고 j는 크기 변경 연산 번호(1, 2, ...)이다. 그 다음 입력 순서대로 안쪽 창 nwin개 각각에 대해 한 줄씩, 네 칸 들여쓰기를 하고 Window i, x = X, y = Y, width = W, height = H 형식으로 출력한다. i는 창 번호, X와 Y는 위치, W와 H는 크기이다.

예제1

  1. 예제 1

    입력
    1 1 50 100
    10 10 30 10 1 0 0 0 0 0
    70 150
    2 1 50 100
    10 10 30 10 1 0 0 0 0 0
    10 80 20 10 1 1 0 0 0 0
    70 150
    1 2 60 60
    10 10 20 30 1 0 1 1 1 1
    90 90
    120 120
    0 0 0 0
    
    예상 출력
    Case 1, resize operation 1:
        Window 1, x = 10, y = 60, width = 50, height = 10
    Case 2, resize operation 1:
        Window 1, x = 10, y = 60, width = 50, height = 10
        Window 2, x = 10, y = 80, width = 40, height = 60
    Case 3, resize operation 1:
        Window 1, x = 15, y = 20, width = 30, height = 30
    Case 3, resize operation 2:
        Window 1, x = 20, y = 30, width = 40, height = 30