Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- BOJ 18877
- JavaScript
- 모바일 버전만들기
- 18881번
- Social Distancing II
- BOJ Social Distancing
- await
- async
- 백준 Social Distancing II
- 반응형 웹
- 백준
- java
- BOJ Social Distancing II
- CCPC
- 18877번 Social Distancing
- 일해라 개발자
- 백준 BOJ
- 베리어블 폰트
- 텐서플로맛
- vue.js
- Catholic univ Computer Programming Contest
- BOJ 18881
- 백준 18877번
- social distancing
- VUE
- Spring Security
- CSS
- spring boot
- 18877번
- BOJ
Archives
- Today
- Total
나아가는 길에 발자국을 찍어보자
[백준/BOJ] 12100번 2048(Easy) 본문
반응형
이번주에는 구현문제를 열심히 풀었는데 그중 제일 나를 괴롭혔던 문제였다.
처음에 문제 이해가 잘 안되서 게임을 해봤는데 이지 문제라서 그런지 게임과는 달리
새로운 블록을 추가하지 않아 이해하고 나면 간단한 문제이다.
현재 상태에서 4방향으로 이동할수있고, 블록을 이동시켜서 최대 5번 이동해서(5번 이하로 이동해도 가능)
만들수있는 가장 큰 블록의 값을 구하면 된다.
https://www.acmicpc.net/problem/12100
12100번: 2048 (Easy)
첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2보다 크거나 같고, 1024보다 작거나 같은 2의 제곱꼴이다. 블록은 적어도 하나 주어진다.
www.acmicpc.net
문제는 완전 탐색으로 풀었다. 현재 상태에서 위,아래,오른쪽,왼쪽으로 이동할때 재귀를 돌렸다.
까다롭다고 생각했던건 블록의 이동을 구현하는것이었는데, 내가 생각했던건 이동을 한방향으로 가는걸로 만들고
이동시키는 배열을 돌려서 4방향으로 이동시키는 것과 같은 걸로 해 구현을 했다.
이동하는 부분을 함수로 따로 구현하고 싶었는데 2차원 배열을 반환하는 걸 찾아봐도 잘 모르겠어서 그냥 노가다를 했다.ㅜㅜ
이부분은 다음에 공부를 해봐할듯하다. 역시 포인터는 헷갈려...

<코드>
#include<iostream> #include<vector> #include<queue> #include<functional> #include<algorithm> #include<string.h> using namespace std; int N; int M = 0; void te(int adj[50][50], int n) { if (n > 5)return; bool ck = true; int rep[50][50] = { 0 }; int idx = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (M < adj[i][j])M = adj[i][j]; } } //왼 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (adj[i][j]) { if (idx>0 && rep[i][idx - 1] == adj[i][j]&&ck) { rep[i][idx - 1] += adj[i][j]; ck = false; } else { rep[i][idx] = adj[i][j]; idx++; ck = true; } } } idx = 0; } te(rep, n + 1); //아래 idx = 0; ck = true; memset(rep, 0, sizeof(rep)); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (adj[N - 1 - j][i]) { if (idx>0 && rep[i][idx - 1] == adj[N - 1 - j][i]&&ck) { rep[i][idx - 1] += adj[N - 1 - j][i]; ck = false; } else { rep[i][idx] = adj[N - 1 - j][i]; idx++; ck = true; } } } idx = 0; } te(rep, n + 1); //오 idx = 0; ck = true; memset(rep, 0, sizeof(rep)); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (adj[i][N - 1 - j]) { if (idx>0 && rep[i][idx - 1] == adj[i][N - 1 - j]&&ck) { rep[i][idx - 1] += adj[i][N - 1 - j]; ck = false; } else { rep[i][idx] = adj[i][N - 1 - j]; idx++; ck = true; } } } idx = 0; } te(rep, n + 1); //위 idx = 0; ck = true; memset(rep, 0, sizeof(rep)); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (adj[j][N - 1 - i]) { if (idx>0 && rep[i][idx - 1] == adj[j][N - 1 - i]&&ck) { rep[i][idx - 1] += adj[j][N - 1 - i]; ck = false; } else { rep[i][idx] = adj[j][N - 1 - i]; idx++; ck = true; } } } idx = 0; } te(rep, n + 1); return; } int main(void) { scanf("%d", &N); int adj[50][50]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { cin >> adj[i][j]; } } te(adj, 0); printf("%d", M); return 0; }
반응형
'Algorithm > Problem Solving' 카테고리의 다른 글
[백준/BOJ] 2499번 의좋은 형제 (0) | 2020.03.27 |
---|---|
[백준/BOJ] 17370번 육각형 우리 속의 개미 (0) | 2020.02.14 |
[백준/BOJ]14500번 테트로미노 (0) | 2020.01.11 |
[백준/BOJ]15685번 드래곤 커브 (0) | 2020.01.11 |
[백준/BOJ] 1242번 소풍 (0) | 2019.12.31 |
Comments