#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <queue> using namespace std; int N; int map[25][25]; int mapCopy[25][25]; int candidate[10]; int Max; void reset() { for(int i = 1; i <= N; i++) { for(int j = 1; j <= N; j++) { map[i][j] = mapCopy[i][j]; } } } int find() { int val = 0; for(int i = 1; i <= N; i++) { for(int j = 1; j <= N; j++) { if(val < map[i][j]) { val = map[i][j]; } } } return val; } void move() { for(int k = 0; k < 5; k++) { // 오른쪽 if(candidate[k] == 0) { for(int i = 1; i <= N; i++) { deque<int> q; // 유효한 숫자만 저장하는 덱 -> 0은 저장X bool merge = false; // 이미 합쳐졌던 블록인지 확인 for(int j = N; j >= 1; j--) { // 마지막 숫자와 현재 숫자가 같으면 합침 + 전에 합쳐진 블록이 아니면 if(q.size() >= 1 && q[q.size()-1] == map[i][j] && merge == false) { q[q.size()-1] += map[i][j]; merge = true; } // 0인 경우는 저장X else if(map[i][j] != 0) { q.push_back(map[i][j]); merge = false; } } for(int j = N; j >= 1; j--) { // 유효한 숫자가 있는 구간에서는 차례대로 넣어줌 if(q.size() >= 1) { map[i][j] = q.front(); q.pop_front(); } // 유효한 숫자가 아닌 구간에서는 0을 넣어줌 else { map[i][j] = 0; } } } } // 왼쪽 else if(candidate[k] == 1) { for(int i = 1; i <= N; i++) { deque<int> q; bool merge = false; for(int j = 1; j <= N; j++) { if(q.size() >= 1 && q[q.size()-1] == map[i][j] && merge == false) { q[q.size()-1] += map[i][j]; merge = true; } else if(map[i][j] != 0) { q.push_back(map[i][j]); merge = false; } } for(int j = 1; j <= N; j++) { if(q.size() >= 1) { map[i][j] = q.front(); q.pop_front(); } else { map[i][j] = 0; } } } } // 위쪽 else if(candidate[k] == 2) { for(int j = 1; j <= N; j++) { deque<int> q; bool merge = false; for(int i = 1; i <= N; i++) { if(q.size() >= 1 && q[q.size()-1] == map[i][j] && merge == false) { q[q.size()-1] += map[i][j]; merge = true; } else if(map[i][j] != 0) { q.push_back(map[i][j]); merge = false; } } for(int i = 1; i <= N; i++) { if(q.size() >= 1) { map[i][j] = q.front(); q.pop_front(); } else { map[i][j] = 0; } } } } // 아래쪽 else if(candidate[k] == 3) { for(int j = 1; j <= N; j++) { deque<int> q; bool merge = false; for(int i = N; i >= 1; i--) { if(q.size() >= 1 && q[q.size()-1] == map[i][j] && merge == false) { q[q.size()-1] += map[i][j]; merge = true; } else if(map[i][j] != 0) { q.push_back(map[i][j]); merge = false; } } for(int i = N; i >= 1; i--) { if(q.size() >= 1) { map[i][j] = q.front(); q.pop_front(); } else { map[i][j] = 0; } } } } } } void permutation(int cnt) { if(cnt == 5) { // 이동 move(); // 최댓값 확인 Max = max(Max, find()); // 리셋 reset(); return; } for(int i = 0; i < 4; i++) { candidate[cnt] = i; permutation(cnt+1); } } int main(void) { // freopen("B12100_input.txt", "r", stdin); cin >> N; for(int i = 1; i <= N; i++) { for(int j = 1; j <= N; j++) { cin >> map[i][j]; mapCopy[i][j] = map[i][j]; } } permutation(0); cout << Max << endl; return 0; } | cs |
'Baekjoon > Simulation' 카테고리의 다른 글
[백준 13458] 시험감독 (Simulation) (C/C++) (0) | 2020.04.09 |
---|---|
[백준 14891] 톱니바퀴 (Simulation) (C/C++) (★) (0) | 2020.04.09 |
[백준 16235] 나무 재테크 (Simulation) (C/C++) (★) (0) | 2020.03.27 |
[백준 15685] 드래곤 커브 (Simulation) (C/C++) (★★) (0) | 2020.03.27 |
[백준 14890] 경사로 (Simulation) (C/C++) (★★) (0) | 2020.03.27 |