좋은 격자
시간 제한2초메모리 제한1024 MB
행과 열을 교환해 1부터 N×N까지의 수가 상하좌우로 이어지는 경로가 되도록 만들고, 필요한 최소 교환 횟수를 구한다.
문제
크기의 격자가 주어진다. 이 격자의 각 칸에는 이상 이하의 서로 다른 정수들이 개씩 적혀있다. 어떤 격자의 이 적힌 칸부터 시작해 상하좌우로 한 칸씩 움직이며 부터 까지의 수를 차례대로 지나는 방법이 존재한다면 그 격자를 '좋은 격자'라고 하자. 주어진 격자에 다음의 시행을 원하는 만큼 할 수 있다.
- 서로 다른 두 행을 골라 교환하거나 서로 다른 두 열을 골라 교환한다.
시행을 통해 주어진 격자를 좋은 격자로 만드는 것이 가능한지 판별하고 가능하다면 좋은 격자로 만들기 위해 필요한 시행의 최소 횟수를 구하여라.
입력
첫째 줄에 격자의 크기를 나타내는 정수인 이 주어진다.
다음 줄에는 정수가 개씩 공백으로 구분되어 주어진다. 번째 줄의 번째 수는 격자의 행 열에 적힌 수를 나타낸다. 이 수들은 이상 이하의 서로 다른 정수임이 보장된다.
출력
첫째 줄에 좋은 격자로 만들기 위한 시행의 최소 횟수를 출력한다. 만약 좋은 격자를 만드는 것이 불가능하다면 -1을 출력한다.
힌트
행과 행을 교환한다는 것은 인 모든 정수 에 대해 행 열과 행 열의 수를 교환한다는 것이다. 비슷하게 열과 열을 교환한다는 것은 인 모든 정수 에 대해 행 열과 행 열의 수를 교환한다는 것이다.