백준문제풀이

백준 문제 12100번 2048 (Easy) 문제풀이 c++

노가다 김씨 2022. 4. 3. 22:34

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

 

12100번: 2048 (Easy)

첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2

www.acmicpc.net

 

문제해석

 

그림생략

평범한 2048게임과 같은 규칙이다. 단 새로은 블록이 추가되지 않는다는 차이 점이 있다.

 

최대 5번 움직일수있고 상하좌우 4방향이므로 총 4^5 = 1024 가지의 경우가 존재한다.

그래서 제한시간에비해 경우가 적으므로 전부 다 해보는 것으로 하기로 결정했다.

 

상하좌우의 경우에 따라 move함수를 구현했는데 이게 보니까 200줄이 넘는다.

 

사실 반복문의 시작위치랑 인덱스정도만 다르고 템플릿은 같기때문에 그것만 조심해서 복붙만한다면 별거없다.

문제는 오타만 내지 않으면 되는데 오타내서 3번이나 틀려먹었다.

 

일반 배열이 아니라 pair 배열을 선언했는데 first부분은 2 4 8 16 32 ... 의  숫자정보가 들어가는 곳으로 

second 부분은 이 블럭이 같은 숫자의 블럭과 합쳐 질 수 있는가의 정보가 들어가는 곳으로 활용하였다.

second=0 -> 합칠 수 있음 second=1 -> 합칠 수 없음

 

또한 move한다는거는 한쪽으로 밀어 넣는것이니 큐나 스택을 활용하여 밀어 넣을수있는데 난 스택을 사용해서 밀어넣었다.

 

코드

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
void dfs(int depth);
void move(int d);
stack <int> st[20];
vector <int> v;
int direction[4]={0,1,2,3}; //오 왼 위 아
pair<int,int> p[20][20];
pair<int,int> original[20][20];
int n;
int ans=0;
int main(){
    cout.tie(NULL);
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    cin>>n;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            cin>>original[i][j].first;
            original[i][j].second=0;
        }
    }
    dfs(0);
    cout<<ans;
}
void dfs(int depth){
    if(depth==5)
    {
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                p[i][j]=original[i][j];
            }
        }
        for(int i=0; i<v.size(); i++)
        {
            move(v[i]);
        }
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                ans=max(ans,p[i][j].first);
            }
        }
        return;
    }
    for(int i=0; i<4; i++)
    {
        v.push_back(direction[i]);
        dfs(depth+1);
        v.pop_back();
    }
}

void move(int d){
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            p[i][j].second=0;
        }
    }
    int index;
    int x;
    if(d==0)
    {
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                if(p[i][j].first!=0)
                {
                    st[i].push(p[i][j].first);
                    p[i][j].first=0;
                }
            }
        }

        for(int i=0; i<n; i++)
        {
            index=n-1;
            while(!st[i].empty())
            {
                x=st[i].top();
                st[i].pop();
                if(index==n-1)
                {
                    p[i][index].first=x;
                    index--;
                }
                else
                {
                    if(p[i][index+1].first==x)
                    {
                        if(p[i][index+1].second==0)
                        {
                            p[i][index+1].first=x+x;
                            p[i][index+1].second=1;
                        }
                        else
                        {
                            p[i][index].first=x;
                            index--;
                        }
                    }
                    else
                    {
                        p[i][index].first=x;
                        index--;
                    }
                }
            }
        }
    }
    else if(d==1)
    {
        for(int i=0; i<n; i++)
        {
            for(int j=n-1; j>=0; j--)
            {
                if(p[i][j].first!=0)
                {
                    st[i].push(p[i][j].first);
                    p[i][j].first=0;
                }
            }
        }

        for(int i=0; i<n; i++)
        {
            index=0;
            while(!st[i].empty())
            {
                x=st[i].top();
                st[i].pop();
                if(index==0)
                {
                    p[i][index].first=x;
                    index++;
                }
                else
                {
                    if(p[i][index-1].first==x)
                    {
                        if(p[i][index-1].second==0)
                        {
                            p[i][index-1].first=x+x;
                            p[i][index-1].second=1;
                        }
                        else
                        {
                            p[i][index].first=x;
                            index++;
                        }
                    }
                    else
                    {
                        p[i][index].first=x;
                        index++;
                    }
                }
            }
        }
    }
    else if(d==2)
    {
        for(int i=0; i<n; i++)
        {
            for(int j=n-1; j>=0; j--)
            {
                if(p[j][i].first!=0)
                {
                    st[i].push(p[j][i].first);
                    p[j][i].first=0;
                }
            }
        }

        for(int i=0; i<n; i++)
        {
            index=0;
            while(!st[i].empty())
            {
                x=st[i].top();
                st[i].pop();
                if(index==0)
                {
                    p[index][i].first=x;
                    index++;
                }
                else
                {
                    if(p[index-1][i].first==x)
                    {
                        if(p[index-1][i].second==0)
                        {
                            p[index-1][i].first=x+x;
                            p[index-1][i].second=1;
                        }
                        else
                        {
                            p[index][i].first=x;
                            index++;
                        }
                    }
                    else
                    {
                        p[index][i].first=x;
                        index++;
                    }
                }
            }
        }
    }
    else if(d==3)
    {
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                if(p[j][i].first!=0)
                {
                    st[i].push(p[j][i].first);
                    p[j][i].first=0;
                }
            }
        }

        for(int i=0; i<n; i++)
        {
            index=n-1;
            while(!st[i].empty())
            {
                x=st[i].top();
                st[i].pop();
                if(index==n-1)
                {
                    p[index][i].first=x;
                    index--;
                }
                else
                {
                    if(p[index+1][i].first==x)
                    {
                        if(p[index+1][i].second==0)
                        {
                            p[index+1][i].first=x+x;
                            p[index+1][i].second=1;
                        }
                        else
                        {
                            p[index][i].first=x;
                            index--;
                        }
                    }
                    else
                    {
                        p[index][i].first=x;
                        index--;
                    }
                }
            }
        }
    }
}