jkjan   3년 전

클릭해주셔서 감사합니다.

 

로직은 특별한 거 없습니다.

그냥 매 시도를 bfs 로 해서 탐색합니다.

 

근데 그 시도하는 과정이 좀 로직이 다를 순 있습니다.

위로 움직인다 그러면 4 x 4 보드에서

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

 

아래면

13 14 15 16

9 10 11 12

5 6 7 8

1 2 3 4

 

왼쪽이면

4 8 12 16

3 7 11 15

2 6 10 14

1 5 9 13 

 

오른쪽은

13 9 5 1

14 10 6 2

15 11 7 3

16 12 8 4  순으로 수를 확인합니다.

그러니까 그 순서가 정수리를 위 아래 왼쪽 오른쪽으로 향하게 하고

정방향으로 탐색하는 거랑 같습니다.

 

아무튼 그렇게 탐색하면서 매 수 마다 위로 끝까지 올려보고

자기 자신과 같은 수를 발견하면, 원래 있던 곳을 0으로 바꾸고

그 수에다가 -2 를 곱해줍니다.

-2를 곱하는 이유는 그냥 2를 곱하면 

그 밑에 줄에서 오는 애랑 수가 똑같아져서 또 더해질 수가 있기 때문입니다.

그런 일을 방지하기 위해 그 합체된 곳의 포인트를 따로 빼놨다가

움직임이 다 끝난 후 그 따로 뺴놓은 포인터들의 값에다가 다시 음수를 곱해줍니다.

 

위에 다른 수가 있다거나 맨 위에 도달했다면

그냥 자기 자신을 0으로 하고

그 공간에다가 원래 수를 채워넣어서 순간이동 시킵니다.

아마 이거 수 옮기는 건 다들 똑같이 구현하셨으리라고 봅니다.

 

여튼 움직이는 시도 하나를 하나의 노드로 보고

bfs 로 거리 재면서 탐색했습니다.

하나의 노드는 그때의 보드 상태,  거기까지 걸린 횟수를 포함합니다.

   

탐색하면서 항상 최대값을 갱신합니다.

 

  

정말 야박하게도 2% 올라가자마자 틀려버리네요...

댓글을 작성하려면 로그인해야 합니다.