(백준) 2048 (심플) – C++

https://www.acmicpc.net/problem/12100

문제

Game 2048은 4×4 보드에서 혼자 플레이하는 재미있는 게임입니다. 그만큼 지름길를 누르면 게임을 할 수 있습니다.

이 게임의 이동은 보드의 전체 블록을 위, 아래, 왼쪽 또는 오른쪽의 네 방향 중 하나로 이동하는 것으로 구성됩니다. 이때 동일한 값을 가진 두 블록이 충돌하면 두 블록이 하나로 병합됩니다. 한 차례에 이미 병합된 블록은 다른 블록과 다시 병합할 수 없습니다. (실제 게임에서는 이동할 때마다 블록이 추가되지만 이 문제에서는 블록이 추가되지 않습니다.)

이 문제에서 논의하는 2048년 게임의 보드 크기는 N×N이다. 보드의 크기와 보드에 있는 블록의 상태를 고려하여 위로 이동할 수 있는 가장 큰 블록의 값을 계산하는 프로그램을 작성하라. 5회까지 가능하다.

기입

첫 번째 줄은 보드 크기 N(1 ≤ N ≤ 20)을 지정합니다. 게임 보드의 초기 상태는 두 번째 행부터 시작하여 N 행으로 제공됩니다. 0은 빈 셀을 나타내고 다른 모든 값은 블록을 나타냅니다. 블록에 적힌 숫자는 2보다 크거나 같고 1024보다 작거나 같은 2의 거듭제곱입니다. 최소 하나의 블록이 지정됩니다.

누르다

최대 5번 이동하여 얻을 수 있는 가장 큰 블록을 반환합니다.


4방향으로 총 5회 이동이 가능하므로 4^5의 경우가 있습니다. 케이스가 1024개 정도니까 다 짚고 넘어갈 수 있을 거라 생각했다. 5회 이내이지만 움직임에 따라 값이 감소하지 않으므로 무조건 5회 수행한다.

기능 -> 방향 선택 5를 선택하여 이동합니다.

동시 기능 -> move 5 호출 후 find_max 호출

이동 기능 -> 매트를 한 방향으로 이동

find_max 함수 -> Mat에서 최대값 찾기

이동 기능에 대한 자세한 설명

1. 라인을 스캔하여 1차원 배열 arr에 저장합니다.

2. 규칙에 따라 arr을 추가합니다.

규칙: 동일한 값의 두 블록이 충돌하면 두 블록이 하나로 병합됩니다. 한 차례에 이미 병합된 블록은 다른 블록과 다시 병합할 수 없습니다.

3. 생성된 arr을 mat에 다시 저장합니다.


문제를 푸는 데 약 70분이 걸렸습니다. 곰곰이 생각하고 코드를 작성했는데 원하는 대로 나오지 않았다.
1. mat()() 값이 있을 때 arr에 복사하려고 했으나 !mat를 썼더니 0만 복사되었다.
2. 동일한 arr 값이 추가되면 0이 아닌 값 사이에 0이 존재하지만 페이지로 푸시되지 않고 다시 mat에 저장됩니다.
두 개를 수정하니 숫자가 잘 나왔고 다른 예시를 넣으면 원하는 결과가 나와서 제출했더니 정답이 나왔다.