숲 그림 그리기
시간 제한2초메모리 제한512 MB
M×M 캔버스에 나무와 그루터기 좌표를 받아 화면 밖은 잘라내며 아스키 숲 그림을 그리고, 별표 테두리를 두른다.
문제
놀이공원에는 어린 방문객에게 인기가 많은 "숲 그림 그리기" 놀이가 있다. 참가 인원에 사실상 제한이 없고 거의 모두가 상을 받는다. 규칙은 간단하다. 진행자가 최근에 본 숲의 모습을 짧게 설명하면, 참가자는 종이와 크레용을 받아 그 모습을 최대한 비슷하게 그린다. 지구 어딘가에 있는 숲의 한 조각을 어떤 화풍으로든 일부라도 그려서 내면 초콜릿이나 과일을 작은 상으로 받는다.
이 문제에서는 이 놀이를 흉내 내는 프로그램을 만든다. 다만 너는 어린 참가자보다 훨씬 능숙하므로 그림이 규격과 정확히 일치해야 한다. 그려야 할 그림에는 빈터가 담겨 있다. 빈터는 둘레의 빽빽한 숲보다 나무가 적게 자란, 숲속의 열린 공간이다. 그림은 아스키 아트로 출력한다.
크기의 그림은 개의 행으로 이루어진 캔버스로 나타내고, 각 행은 개의 문자로 이루어진다. 그림의 화소 하나는 캔버스 위의 출력 가능한 아스키 문자 하나로 나타내고, 화소의 좌표는 캔버스 위 문자의 좌표와 같다. 그림의 왼쪽 아래 구석 화소의 좌표는 , 오른쪽 위 구석 화소의 좌표는 이다. 오른쪽 아래 구석 화소의 좌표는 이다.
그림의 화소는 각각 풀밭이거나, 서 있는 나무의 일부이거나, 그루터기의 일부다. 풀밭 화소는 점 하나 . (아스키 코드 46)로 나타낸다. 서 있는 나무와 그루터기는 화소 여러 개로 그리며, 캔버스에 나타나는 모양은 다음과 같다.
서 있는 나무의 높이 는 양수이고, 나무는 뿌리, 줄기, 가지, 꼭대기의 네 부분으로 이루어진다. 뿌리는 가로로 이웃한 문자 세 개 _|_ (아스키 코드 95, 124, 95)로 나타낸다. 줄기는 뿌리 한가운데의 바로 위에 세로로 이웃하게 놓인 세로 막대 | (아스키 코드 124) 개다. 가지는 줄기 바로 왼쪽에 놓인 왼쪽 가지 개와 줄기 바로 오른쪽에 놓인 오른쪽 가지 개로 이루어지고, 가지는 모두 줄기와 맞닿는다. 왼쪽 가지 하나는 빗금 / (아스키 코드 47), 오른쪽 가지 하나는 역빗금 \ (아스키 코드 92)로 나타낸다. 꼭대기는 줄기의 가장 위 문자 바로 위에 놓인 ^ (아스키 코드 94) 하나다.
그루터기는 가로로 이웃한 화소 세 개이고, _o_ (아스키 코드 95, 111, 95)로 나타낸다.
서 있는 나무나 그루터기는 좌표에 따라 그림에 일부만 나오거나 아예 나오지 않을 수 있다.
입력
입력에는 여러 개의 테스트 케이스가 들어 있고, 파일의 끝까지 이어진다. 각 테스트 케이스의 첫 줄에는 공백으로 구분된 두 정수 , 이 주어진다 (, ). 이어지는 개의 줄에는 서 있는 나무 하나 또는 그루터기 하나를 나타내는 세 정수 , , 가 공백으로 구분되어 주어진다. 와 는 나무 뿌리 또는 그루터기의 한가운데 좌표다. 이면 그루터기이고, 이면 높이가 인 서 있는 나무다. , 이다.
서로 다른 두 나무나 그루터기의 부분이 같은 화소에 그려지는 경우는 없다.
출력
각 테스트 케이스마다 빈터 그림이 담긴 캔버스를 출력한다. 캔버스의 맨 위 행을 가장 먼저 출력하고, 맨 아래 행을 마지막으로 출력한다. 출력물은 두께가 화소 하나인 별표 * (아스키 코드 42) 정사각형 테두리로 감싼다. 테두리는 캔버스에 딱 붙어야 한다. 즉, 가로로도 세로로도 테두리와 캔버스 사이에 빈칸이 없어야 한다. 각 테스트 케이스를 출력한 뒤에는 빈 줄을 하나 출력한다.