퀸 충돌

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

요약
n x n 체스판에 등차수열로 놓인 퀸 무리를 입력받아, 사이에 다른 퀸이 없는 같은 행, 열, 대각선 쌍의 개수를 센다.
난이도

보통10점 중 7점

유형
수학, 정렬, 해시맵, 구현
정답자
아직 제출이 없습니다

문제

체스판 위에 여러 개의 퀸이 놓여 있다. 서로 다른 두 퀸이 같은 행, 같은 열, 또는 같은 대각선 위에 있고, 그 사이(같은 직선 위)에 다른 퀸이 하나도 없으면 두 퀸은 충돌한다. 판의 크기와 퀸의 개수는 경우마다 다르게 주어진다.

n×nn \times n 판에서 각 퀸의 위치는 좌표 (x,y)(x, y)로 나타낸다. xx는 열 번호로 11부터 nn까지, yy는 행 번호로 11부터 nn까지이다. 서로 다른 두 위치 (x1,y1)(x_1, y_1)과 (x2,y2)(x_2, y_2)는 다음과 같이 판정한다.

  • y1=y2y_1 = y_2이면 같은 행 위에 있다.
  • x1=x2x_1 = x_2이면 같은 열 위에 있다.
  • ∣x1−x2∣=∣y1−y2∣|x_1 - x_2| = |y_1 - y_2|이면 같은 대각선 위에 있다.

이 세 경우 각각에 대해, 해당 직선(행·열·대각선)을 따라 두 퀸 사이에 다른 퀸이 하나도 없을 때에만 두 퀸은 충돌한다. 따라서 한 직선 위에 퀸이 여러 개 놓여 있으면, 그 직선을 따라 정렬했을 때 바로 이웃한 퀸끼리만 충돌한다. 예를 들어 어떤 반대각선 위에 다섯 퀸 (5,1),(4,2),(3,3),(2,4),(1,5)(5, 1), (4, 2), (3, 3), (2, 4), (1, 5)가 놓이면, 충돌은 (5,1)(5,1)–(4,2)(4,2), (4,2)(4,2)–(3,3)(3,3), (3,3)(3,3)–(2,4)(2,4), (2,4)(2,4)–(1,5)(1,5)의 네 쌍에서만 일어난다.

퀸들은 흔히 규칙적인 형태로 놓인다. 이런 규칙을 이용하면 많은 퀸의 위치를 간결하게 나타낼 수 있으므로, 입력은 등차적으로 배치된 퀸들의 묶음(선형 패턴)들로 주어진다. 주어진 배치에서 발생하는 충돌의 총 개수를 세는 프로그램을 작성하시오.

입력

입력은 11개 이상 2020개 이하의 데이터 집합으로 이루어지며, 마지막에는 00 하나만 있는 줄이 온다.

각 데이터 집합의 첫 줄에는 공백으로 구분된 두 양의 정수 nn과 gg가 주어진다. nn은 판의 크기가 n×nn \times n임을 뜻하며 n<30000n < 30000이고, gg는 이어서 설명할 선형 패턴의 개수로 g<250g < 250이다. 다음 gg개의 줄에는 각각 공백으로 구분된 다섯 정수 k x y s tk\ x\ y\ s\ t가 주어지며, 이는 위치 (x+i⋅s, y+i⋅t)(x + i \cdot s,\ y + i \cdot t) (i=0,1,…,k−1i = 0, 1, \dots, k-1)에 놓인 kk개의 퀸을 나타낸다. kk는 양의 정수이다. k=1k = 1이면 ss와 tt의 값은 의미가 없으며, 이때 두 값은 00으로 주어진다.

모든 퀸의 위치는 판 안에 있다. 한 데이터 집합의 모든 선형 패턴에 속한 퀸의 총 개수는 nn을 넘지 않으며, 이 퀸들의 위치는 모두 서로 다르다.

출력

각 데이터 집합마다 한 줄에 그 배치에서 발생하는 충돌의 총 개수를 출력한다.

퀸의 개수가 많을 수 있으므로 알고리즘의 효율에 주의해야 한다.

예제3

  1. 예제 1

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

    입력
    5 1
    1 3 3 0 0
    0
    
    예상 출력
    0
    
  3. 예제 3

    입력
    5 1
    2 1 1 1 0
    0
    
    예상 출력
    1