만드는 중입니다

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

나선

시간 제한1초메모리 제한64 MB

요약
K개의 나선이 이동 거리 1,1,2,2,... 규칙으로 N×M 격자 위를 움직일 때, 각 칸에 가장 먼저 도달한 나선의 걸음 수를 출력한다. 10^100걸음까지 고려한다.
난이도

보통10점 중 6점

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

문제

NN행 MM열짜리 표가 있다. 표는 처음에 비어 있고, 그 위에 나선 KK개가 놓여 있다. 각 나선은 자기 출발 칸에서 움직이기 시작하며, 회전 방향은 시계 방향과 반시계 방향 중 하나다.

나선 하나는 다음 규칙으로 움직인다.

  • 1단계에서 나선은 출발 칸에 있다.
  • 그 뒤로는 직선 구간을 차례대로 지나간다. 구간의 길이는 순서대로 1,1,2,2,3,3,4,4,…1, 1, 2, 2, 3, 3, 4, 4, \dots이고, 길이가 LL인 구간에서는 같은 방향으로 한 칸씩 LL번 움직인다.
  • 첫 구간의 방향은 위쪽, 즉 행 번호가 줄어드는 쪽이다.
  • 구간이 끝날 때마다 방향이 한 번 꺾인다. 시계 방향 나선은 위, 오른쪽, 아래, 왼쪽 순서를 반복하고, 반시계 방향 나선은 위, 왼쪽, 아래, 오른쪽 순서를 반복한다.

나선은 모두 동시에 움직이고, 한 단계마다 각자 한 칸씩 나아간다. 나선이 표 밖으로 나갔다가 나중에 다시 표 안으로 들어오기도 한다.

정확히 1010010^{100}단계가 지난 뒤, 각 칸의 값은 어떤 나선이 그 칸을 처음 밟은 단계 번호다.

그림 1

그림 1: 반시계 방향으로 움직이는 나선

그림 2

그림 2: 시계 방향으로 움직이는 나선

입력

첫째 줄에 NN, MM (1≤N,M≤501 \le N, M \le 50)과 KK (1≤K≤N×M1 \le K \le N \times M)가 주어진다.

다음 KK개 줄에는 정수 XiX_i, YiY_i, TiT_i (1≤Xi≤N1 \le X_i \le N, 1≤Yi≤M1 \le Y_i \le M, 0≤Ti≤10 \le T_i \le 1)가 주어진다. XiX_i와 YiY_i는 ii번째 나선이 출발하는 칸의 행 번호와 열 번호이고, TiT_i가 0이면 시계 방향, 1이면 반시계 방향이다. 출발 칸이 같은 나선은 없다.

출력

NN개 줄에 걸쳐 한 줄에 MM개의 수를 공백 하나로 구분해 출력한다. ii번째 줄의 jj번째 수는 ii행 jj열 칸의 값이다.

힌트

세 번째 예제를 그림으로 설명하면 다음과 같다.

세 번째 예제

보기 편하도록 첫 번째 나선이 남긴 수에는 A를, 두 번째 나선이 남긴 수에는 B를 붙였다. 첫 번째 나선은 20단계까지, 두 번째 나선은 21단계까지만 그렸다. 회색 칸이 표에 속한 칸이고, 나머지 칸은 표 밖이지만 나선이 표 밖에서 어떻게 움직이는지 보이려고 함께 그렸다.

예제3

  1. 예제 1

    입력
    3 3 1
    2 2 0
    
    예상 출력
    9 2 3
    8 1 4
    7 6 5
    
  2. 예제 2

    입력
    3 3 1
    2 2 1
    
    예상 출력
    3 2 9
    4 1 8
    5 6 7
    
  3. 예제 3

    입력
    3 3 2
    1 1 0
    1 2 0
    
    예상 출력
    1 1 4
    6 5 5
    19 18 17