Algorithm/Baekjoon
[Baekjoon] C++ 12100 EASY
freedommmm
2021. 9. 12. 19:39
#사람마다 푼 방법이 다릅니다. 아 이런 코드도 있구나라는 생각만 가져주시면 감사하겠습니다. 제 코드에 있어서 비효율적인 부분이 있으면 댓글로 남겨놔 주시면 참고하여 성장할 수 있도록 하겠습니다!!!
하지만!!! 무분별한 비난은 삼가 주세요!
해당 문제는 단순 시뮬레이션 + 구현문제입니다. 저는 백준 페이지에서 참고로 할 수 있는 게임을 통해서 문제를 풀어봤습니다. 그리고 블럭을 옮기는 부분을 3가지 단계로 구현했습니다. 먼저 해당 방향으로 옮기기, 블럭 합치기, 빈칸이 생겼으니 다시 블럭 옮기기로 나눴습니다.
#include<iostream>
#define SIZE 20
using namespace std;
int N;
int map[SIZE][SIZE];
int copyMap[SIZE][SIZE];
int dir[5];
int ans = -1;
void init() {
for (int a = 0; a < SIZE; a++) {
for (int b = 0; b < SIZE; b++) {
map[a][b] = 0;
copyMap[a][b] = 0;
}
}
for (int a = 0; a < 5; a++) {
dir[a] = 0;
}
}
void Input() {
cin >> N;
for (int a = 0; a < N; a++) {
for (int b = 0; b < N; b++) {
cin >> map[a][b];
}
}
}
void cpMap() {
for (int a = 0; a < N; a++) {
for (int b = 0; b < N; b++) {
copyMap[a][b] = map[a][b];
}
}
}
void moveMap(int index) {
if (index == 0) {
for (int b = 0; b < N; b++) {
int count = 0;
for (int a = 0; a < N; a++) {
if (copyMap[a][b] == 0) {
count++; continue;
}
if (count == 0) continue;
copyMap[a - count][b] = copyMap[a][b];
copyMap[a][b] = 0;
a -= count;
count = 0;
}
}
}
//아래
else if (index == 1) {
for (int b = 0; b < N; b++) {
int count = 0;
for (int a = N - 1; a >=0; a--) {
if (copyMap[a][b] == 0) {
count++; continue;
}
if (count == 0) continue;
copyMap[a + count][b] = copyMap[a][b];
copyMap[a][b] = 0;
a += count;
count = 0;
}
}
}
//왼쪽
else if (index == 2) {
for (int a = 0; a < N; a++) {
int count = 0;
for (int b = 0; b < N; b++) {
if (copyMap[a][b] == 0) {
count++; continue;
}
if (count == 0) continue;
copyMap[a][b-count] = copyMap[a][b];
copyMap[a][b] = 0;
b -= count;
count = 0;
}
}
}
//오른쪽
else {
for (int a = 0; a < N; a++) {
int count = 0;
for (int b = N - 1; b >= 0; b--) {
if (copyMap[a][b] == 0) {
count++; continue;
}
if (count == 0) continue;
copyMap[a][b + count] = copyMap[a][b];
copyMap[a][b] = 0;
b += count;
count = 0;
}
}
}
}
void sumMap(int index) {
//위
if (index == 0) {
for (int b = 0; b < N; b++) {
for (int a = 0; a < N-1; a++) {
if (copyMap[a][b] == copyMap[a+1][b] && copyMap[a][b] != 0) {
copyMap[a][b] = copyMap[a][b] * 2;
copyMap[a+1][b] = 0;
a++;
}
}
}
}
//아래
else if (index == 1) {
for (int b = 0; b < N; b++) {
for (int a = N-1; a >=1; a--) {
if (copyMap[a][b] == copyMap[a - 1][b] && copyMap[a][b] != 0) {
copyMap[a][b] = copyMap[a][b] * 2;
copyMap[a - 1][b] = 0;
a--;
}
}
}
}
//왼쪽
else if (index == 2) {
for (int a = 0; a < N; a++) {
for (int b = 0; b < N - 1; b++) {
if (copyMap[a][b] == copyMap[a][b+1] && copyMap[a][b] != 0) {
copyMap[a][b] = copyMap[a][b] * 2;
copyMap[a][b+1] = 0;
b++;
}
}
}
}
//오른쪽
else {
for (int a = 0; a < N; a++) {
for (int b = N-1; b >=1; b--) {
if (copyMap[a][b] == copyMap[a][b - 1] && copyMap[a][b] != 0) {
copyMap[a][b] = copyMap[a][b] * 2;
copyMap[a][b - 1] = 0;
b--;
}
}
}
}
}
int ansMap() {
int tans = 0;
for (int a = 0; a < N; a++) {
for (int b = 0; b < N; b++) {
if (copyMap[a][b] > tans) {
tans = copyMap[a][b];
}
}
}
return tans;
}
void Solution() {
cpMap();
for (int a = 0; a < 5; a++) {
moveMap(dir[a]);
sumMap(dir[a]);
//print();
moveMap(dir[a]);
//print();
}
int tans = ansMap();
if (tans > ans) {
ans = tans;
}
}
void dfs(int level) {
if (level == 5) {
Solution();
return;
}
for (int a = 0; a < 4; a++) {
dir[level] = a;
dfs(level + 1);
}
}
void Solve() {
init();
Input();
dfs(0);
cout << ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
Solve();
}