좋은 격자

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

요약
행과 열을 교환해 1부터 N×N까지의 수가 상하좌우로 이어지는 경로가 되도록 만들고, 필요한 최소 교환 횟수를 구한다.
난이도

어려움10점 중 8점

유형
구현, 정렬, 이분 탐색, 동적 계획법
정답자
아직 제출이 없습니다

문제

N×NN \times N 크기의 격자가 주어진다. 이 격자의 각 칸에는 11이상 N×NN \times N이하의 서로 다른 정수들이 11개씩 적혀있다. 어떤 격자의 11이 적힌 칸부터 시작해 상하좌우로 한 칸씩 움직이며 11부터 N×NN \times N까지의 수를 차례대로 지나는 방법이 존재한다면 그 격자를 '좋은 격자'라고 하자. 주어진 격자에 다음의 시행을 원하는 만큼 할 수 있다.

  • 서로 다른 두 행을 골라 교환하거나 서로 다른 두 열을 골라 교환한다.

시행을 통해 주어진 격자를 좋은 격자로 만드는 것이 가능한지 판별하고 가능하다면 좋은 격자로 만들기 위해 필요한 시행의 최소 횟수를 구하여라.

입력

첫째 줄에 격자의 크기를 나타내는 정수인 NN 이 주어진다. (2≤N≤1 000) (2 \leq N \leq 1\ 000)

다음 NN줄에는 정수가 NN개씩 공백으로 구분되어 주어진다. y+1y+1번째 줄의 xx번째 수는 격자의 yy행 xx열에 적힌 수를 나타낸다. 이 수들은 11 이상 N×NN \times N 이하의 서로 다른 정수임이 보장된다.

출력

첫째 줄에 좋은 격자로 만들기 위한 시행의 최소 횟수를 출력한다. 만약 좋은 격자를 만드는 것이 불가능하다면 -1을 출력한다.

힌트

aa행과 bb행을 교환한다는 것은 1≤i≤N1\leq i \leq N인 모든 정수 ii에 대해 aa행 ii열과 bb행 ii열의 수를 교환한다는 것이다. 비슷하게 aa열과 bb열을 교환한다는 것은 1≤i≤N1\leq i \leq N인 모든 정수 ii에 대해 ii행 aa열과 ii행 bb열의 수를 교환한다는 것이다.

예제1

  1. 예제 1

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