솔리테어
시간 제한2초메모리 제한256 MB
주어진 초기 카드 순서로 모든 카드를 도움 더미를 활용해 목표 더미로 옮길 때 필요한 되돌리기 횟수의 최솟값을 구합니다.
문제
부터 까지 번호가 붙은 카드 장이 있다. 게임을 시작할 때 이 카드는 모두 뒷면이 보이도록 "초기" 자리에 쌓여 있다. 카드를 앞면이 보이게 놓을 수 있는 자리는 "목표", "보조", "임시" 세 곳이다. 앞면이 보이는 카드는 이 세 자리 중 한 곳의 맨 위에 있을 때만 다른 자리로 옮길 수 있다. 카드 장이 모두 목표에 오름차순으로 쌓이고 맨 위가 이 되면 게임을 이긴다.
규칙은 다음과 같다.
- 목표의 맨 위 카드 값이 놓으려는 카드 값보다 1 작을 때만 그 카드를 목표에 놓는다. 목표가 비어 있으면 값이 인 카드만 놓을 수 있다. 예를 들어 목표의 맨 위 카드가 이면 목표에 놓을 수 있는 카드는 뿐이다.
- 보조의 맨 위 카드 값이 놓으려는 카드 값보다 1 클 때만 그 카드를 보조에 놓는다. 보조가 비어 있으면 값이 인 카드만 놓을 수 있다. 예를 들어 보조의 맨 위 카드가 이면 보조에 놓을 수 있는 카드는 뿐이다.
- 임시로 옮길 수 있는 카드는 초기 더미의 맨 위 카드뿐이고, 뒤집어서 앞면이 보이게 놓는다.
- 초기 더미가 비었는데 아직 게임이 끝나지 않았으면, 임시에 쌓인 카드를 통째로 뒤집어 초기 자리에 놓는다. 이렇게 만든 더미가 새 초기 더미가 된다. 이때 임시의 맨 위 카드가 새 초기 더미의 맨 아래 카드가 된다.
게임을 끝내는 데 필요한 4번 이동의 최소 횟수를 구하라.
입력
첫째 줄에 테스트 케이스의 개수 가 주어진다. ()
각 테스트 케이스는 두 줄이다. 첫째 줄에 카드 수 이 주어진다. () 둘째 줄에 초기 더미를 나타내는 정수 개가 주어진다. 첫 번째 수가 초기 더미의 맨 아래 카드이고, 마지막 수가 맨 위 카드여서 임시로 가장 먼저 옮겨진다. 이 수열은 부터 까지의 순열이다.
출력
각 테스트 케이스마다 게임을 이기는 데 필요한 4번 이동의 최소 횟수를 한 줄에 하나씩 출력한다.