백준알고리즘
2048 (Easy)
먼지의삶
2019. 7. 31. 05:18
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdlib>
#include<string>
using namespace std;
int n;
int map[21][21];
int temp[21][21];
bool f[21];
int ans = 0;
int sum;
void move(int dir) {
if (dir == 1) {//down
for (int i = 0; i < n; i++) {
for (int j = 0; j < 20; j++)
f[j] = false;
for (int j = 0; j < n; j++) {
if (map[j][i] != 0) {
for (int k = j -1; k >= 0; k--) {
if (map[k][i] != 0) {
if (map[k][i] == map[j][i]) {
if (f[k] == false) {
map[k][i] *= 2;
map[j][i] = 0;
f[k] = true;
break;
}
else {
if (k + 1 != j)
{
map[k + 1][i] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else
{
if (k + 1 != j)
{
map[k + 1][i] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else if (k == 0) {
if (map[k][i] == 0) {
map[k][i] = map[j][i];
map[j][i] = 0;
break;
}
}
}
}
}
}
}
if (dir == 2) {//up
for (int i = 0; i < n; i++) {
for (int j = 0; j < 20; j++)
f[j] = false;
for (int j = n-1; j >= 0; j--) {
if (map[j][i] != 0) {
for (int k = j + 1; k < n; k++) {
if (map[k][i] != 0) {
if (map[k][i] == map[j][i]) {
if (f[k] == false) {
map[k][i] *= 2;
map[j][i] = 0;
f[k] = true;
break;
}
else {
if (k - 1 != j)
{
map[k - 1][i] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else
{
if (k -1 != j)
{
map[k - 1][i] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else if (k == n-1) {
if (map[k][i] == 0) {
map[k][i] = map[j][i];
map[j][i] = 0;
break;
}
}
}
}
}
}
}
if (dir == 3) {//LEFT
for (int j = 0; j < n; j++) {
for (int i = 0; i < 20; i++)
f[i] = false;
for (int i = 0; i < n; i++) {
if (map[j][i] != 0) {
for (int k = i - 1; k >= 0; k--) {
if (map[j][k] != 0) {
if (map[j][k] == map[j][i]) {
if (f[k] == false) {
map[j][k] *= 2;
f[k] = true;
map[j][i] = 0;
break;
}
else {
if (k + 1 != i)
{
map[j][k + 1] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else
{
if (k + 1 != i)
{
map[j][k + 1] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else if (k == 0) {
if (map[j][k] == 0) {
map[j][k] = map[j][i];
map[j][i] = 0;
break;
}
}
}
}
}
}
}
if (dir == 4) {//LEFT
for (int j = 0; j < n; j++) {
for (int i = 0; i < 20; i++)
f[i] = false;
for (int i = n-1; i >= 0; i--) {
if (map[j][i] != 0) {
for (int k = i + 1; k < n; k++) {
if (map[j][k] != 0) {
if (map[j][k] == map[j][i]) {
if (f[k] == false) {
map[j][k] *= 2;
f[k] = true;
map[j][i] = 0;
break;
}
else {
if (k - 1 != i)
{
map[j][k - 1] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else
{
if (k - 1 != i)
{
map[j][k - 1] = map[j][i];
map[j][i] = 0;
}
break;
}
}
else if (k == n - 1) {
if (map[j][k] == 0) {
map[j][k] = map[j][i];
map[j][i] = 0;
break;
}
}
}
}
}
}
}
}
int sibal(char x) {
if (x == '1')
return 1;
if (x == '2')
return 2;
if (x == '3')
return 3;
if (x == '4')
return 4;
}
void go(int i,int dir) {
if (i == 5) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (map[i][j] > ans) ans = map[i][j];
}
}
if (sum < ans) sum = ans;
ans = 0;
return;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
temp[i][j] = map[i][j];
}
}
move(dir);
//if (!check()) return;
for (int j = 1; j <= 4; j++) {
go(i + 1, j);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
map[i][j] = temp[i][j];
}
}
}
int main() {
cin >> n;
//t dir;
//cin >> dir;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++) {
cin >> map[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
ans = ans < map[i][j] ? map[i][j] : ans;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
temp[i][j] = map[i][j];
}
}
int tw[] = { 1,1,1,1,1 };
while(true) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
map[i][j] = temp[i][j];
}
}
move(tw[0]);
move(tw[1]);
move(tw[2]);
move(tw[3]);
move(tw[4]);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (map[i][j] > ans) {
ans = map[i][j];
}
}
}
tw[0]++;
if (tw[0] > 4)
{
tw[0] = 1;
tw[1]++;
if (tw[1] > 4) {
tw[1] = 1;
tw[2]++;
if (tw[2] > 4) {
tw[2] = 1;
tw[3]++;
if (tw[3] > 4)
{
tw[3] = 1;
tw[4]++;
if (tw[4] > 4) {
break;
}
}
}
}
}
}
cout << ans << endl;
return 0;
}
ㅎㅎ; 재귀로하다가 계속답안나와서 그냥 브루트포스로 하나하나 다해봤다
메인함수 조건대로 진행함