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