페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#4631

카드짝맞추기 5s 256MB

문제

게임 개발자인 커미는 다음과 같은 간단한 카드 짝맞추기 보드 게임을 개발해 보고자 한다.

 

게임이 시작되면 화면에는 카드 16장이 뒷면을 위로하여 4 × 4크기의 격자 형태로 배치되어 있다.

뒷면은 일반적인 카드의 뒷모양으로 모두 같은 모양이다.

앞면에는 8종류의 그림카드가 각각 2장씩 무작위로 배치되어 있다.

 

사용자가 카드를 2장 선택하여 앞면으로 뒤집었을 때 

같은 그림이 나오면 두 카드는 사라진다.

같은 그림이 아니라면 다시 뒤집힌 상태로 돌아간다.

이와 같은 방법으로 모든 카드를 사라지게 하면 게임은 종료된다.

 

게임에서 카드를 선택하는 방법은 커서를

방향키와 Ctrl 키를 이용하여 이동한후 Enter키를 눌러 뒤집는다.

커서의 초기위치는 문제에서 주어진다.

 

* 방향키 ↑, →, ↓, ← 중 하나를 누르면, 누른 키 방향으로 한칸 이동한다.

  이동할 수 없다면 그 자리에 있는다.

* Ctrl을 누른 상태에서 ↑, →, ↓, ← 중 하나를 누르면, 누른 키 방향에 있는

  가장 가까운 카드로 한번에 이동한다.

  누른 키 방향에 카드가 하나도 없다면 그 방향의 마지막 칸으로 이동한다.

  이동할 수 없다면 그 자리에 있는다.

* 커서가 위치한 곳에 카드가 있다면 Enter키를 입력하여 카드를 뒤집을 수 있다.

  그림이 있다하더라도 그냥 지나갈 수 있다.

  # 카드를 뒤집었을 때 앞면이 보이는 카드가 1장 뿐이라면 숫자를 맞출 수 없으므로 

    두번째 카드를 뒤집을 때까지 앞면을 유지한다.

  # 앞면이 보이는 카드가 2장이 된 경우, 두 개의 카드에 그려진 그림이 같으면

    해당 카드들이 사라진다. 두개의 카드에 그려진 그림이 다르다면 다시 원래대로 뒤집힌다.

 

커미는 게임 진행 중 카드의 짝을 맞춰 몇 장 제거된 상태에서 카드 앞면의 그림을 알고 있다면,

남은 카드를 모두 제거하는데 필요한 키 조작 횟수의 최솟값을 구하려고 한다.

키 조작 횟수는 방향키와 Enter키를 누르는 동작을 각각 조작 횟수 1로 계산한다.

그리고 방향키와 Ctrl키를 함께 누르는 동작은 조작 횟수 1로 계산한다.

 

아래는 카드가 몇장 제거된 상태의 게임화면을 간단하게 표시한 것이다.

빈칸은 이미 카드가 제거된 것이고 같은 숫자는 같은 그림을 나타낸다.

 

초기 화면이다. 초기 커서의 위치는 (1, 0)에서 시작한다.

 

 

 

 번호가 3인 그림을 짝을 맞추는데 아래와 같이 4번의 키 조작이 필요하다.

 

 

 

번호가 2인 그림을 짝을 맞추는데 아래와 같이 5번의 키 조작이 필요하다.​

 

현재 카드가 놓인 상태를 나타내는 정보와 초기 커서의 위치가 주어질 때,

모든 카드를 제거하기 위한 키 조작횟수의 최소값을 구하는 프로그램을 작성하시오.​


입력

4개의 행에 카드의 상태를 나타내는 정보가 주어진다.

각 행의 4개의 수는 공백으로 구분되어 주어진다.

0은 이미 제거된 카드가 있던 자리이다.

같은 숫자는 같은 그림을 나타낸다.

등장하는 숫자는 0 ~ 6 사이(0, 6포함)의 정수이다.

1 ~ 6 인 숫자가 있다면 2개씩 주어진다.

다섯 번째 행에 초기 커서의 위치가 r, c가 공백으로 구분되어 주어진다.

(0 <= r, c <= 3)​ 


출력

모든 카드를 제거하기 위한 키 조작횟수의 최소값을 구하여 출력한다.

 


예제 #1

1 0 0 3

2 0 0 0
0 0 0 2
3 0 1 0
1 0
14

예제 #2

3 0 0 2

0 0 1 0
0 1 0 0
2 0 0 3
0 1
16


출처

kakao2020_2 6번 | dnfka0930
로그인해야 코드를 작성할 수 있어요.