장기 馬
시간 제한1초메모리 제한128 MB
고정된 기물이 가로막는 이동을 피해 장기의 말이 시작 칸에서 목표 칸까지 가는 최소 이동 횟수를 구합니다.
문제
장기는 바둑과 함께 오랜 전통을 가진 보드게임이다. 여러 종류의 기물로 상대의 궁을 제압하는 것이 목적이고, 몇 수 앞을 내다보며 자기 기물을 운용하는 것이 기본 전략이다. 그중 馬는 민첩하게 움직여서 쓰임이 많다. 다만 움직임이 독특해서 초보자가 다루기는 쉽지 않다. 馬를 잘 쓰려면 지금 자리에서 가려는 지점까지 최소 몇 번에 갈 수 있는지부터 볼 줄 알아야 한다.
馬의 이동 방식은 아래 그림과 같다. 한 번의 이동으로 날 일(日) 자를 가로지른다. 체스의 knight와 비슷하지만, 馬는 직선으로 한 칸 간 뒤 대각선으로 한 칸 더 가는 것이어서 중간 칸에 다른 기물이 있으면 그 위를 넘어가지 못한다.

그림 1: 馬의 이동 방식
馬는 한 번의 이동으로 한 칸 앞으로 나아간 뒤 대각선으로 한 칸 더 가서, 전체적으로 날 일(日) 자를 가로지른다.
붉게 칠한 원이 (중간에 다른 기물이 없을 때) 馬가 한 번에 갈 수 있는 자리이다.
장기판에 馬와 다른 기물이 놓여 있을 때, 현재 위치에서 목적지까지 馬가 최소 몇 번 움직여야 하는지 구하는 프로그램을 작성하시오. 장기판은 무한히 넓다고 가정한다. 馬의 현재 좌표와 목적지 좌표, 그리고 다른 기물의 좌표가 주어진다. 馬가 움직이는 동안 다른 기물은 제자리에 그대로 있고, 이 무한한 장기판에는 궁(대각선 이동로가 그어진 자리)이 없다고 가정한다. 馬가 완전히 막혀서 목적지까지 가지 못하는 경우도 없다고 가정한다.
입력
입력은 표준 입력으로 받는다. 첫 줄에 테스트 케이스의 개수 ()가 주어진다.
각 테스트 케이스의 첫째 줄에는 馬의 현재 좌표가, 둘째 줄에는 馬가 도착해야 할 좌표가 주어진다. 셋째 줄에는 다른 기물의 개수 ()가 주어지고, 이어지는 개의 줄에 다른 기물의 좌표가 한 줄에 하나씩 주어진다. 이 좌표는 馬가 설 수 없는 자리이다. 모든 좌표는 이상 이하의 정수 두 개이고, 공백으로 구분된다.
출력
출력은 표준 출력으로 한다. 각 테스트 케이스마다 馬의 최소 이동 횟수를 한 줄에 하나씩 출력한다.