[SWEA] 벽돌깨기

Date:

[SWEA] 벽돌깨기

Problem URL : 벽돌깨기

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#define p pair<int,int>
using namespace std;

int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};

int map[12][15];
int W, H;
int ans;

struct Node{
    int x;
    int y;
    int value;
    Node(int a,int b, int c): x(a), y(b), value(c){};
};


bool inRange(int x, int y){
    if(x < 0 || x >= W || y < 0 || y >= H)
        return false;
    return true;
}

void dfs(int shots){
    if( shots == 0 ){
        int sum = 0;
        for(int w=0; w<W; w++){
            for(int h=0; h<H; h++){
                if(map[w][h] != 0) sum++;
            }
        }
        if(ans > sum) {
            ans = sum;
        }
        return ;
    }
    
    int init_map[12][15];
   
    for(int w=0; w<W; w++) {
        for(int h=0; h<H; h++) {
            init_map[w][h] = map[w][h];
        }
    }

    for(int w=0; w<W; w++){
        queue<Node> q;
        for(int h=0; h<H; h++){
            if(map[w][h] != 0 ){
                q.push( Node(w, h, map[w][h]) );
                map[w][h] = 0;
                break;
            }
        }
     
        while (!q.empty()) {
            int x = q.front().x;
            int y = q.front().y;
            int value = q.front().value;
            q.pop();
            
            for(int d=0; d<4; d++){
                int nx = x;
                int ny = y;
                for(int i = 0; i < value-1; i++){
                    nx = nx + dx[d];
                    ny = ny + dy[d];
                    if(inRange(nx, ny) && map[nx][ny] != 0) {
                        q.push(Node(nx,ny, map[nx][ny]));
                        map[nx][ny] = 0;
                    }
                }
            }
        
        }
        
        for(int x = 0; x < W; x++){
            queue<int> q;
            
            for(int y = H - 1; y >= 0; y--){
                if(map[x][y] != 0) {
                    q.push(map[x][y]);
                    map[x][y] = 0;
                }
            } 
            int y = H - 1;
            while(!q.empty()) {
                map[x][y] = q.front();
                q.pop();
                y--;
            }

        } 

        dfs(shots - 1);
        
        for(int w=0; w<W; w++) {
            for(int h=0; h<H; h++) {
                map[w][h] = init_map[w][h];
            }
        }
    }
}

int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    
    int TC;
    cin >> TC;
    
    for(int tc=1; tc<=TC; tc++){
        memset(map,0,sizeof(map));
        ans = 1e9;
        int shots;
        cin >> shots >> W >> H ;
        for(int h=0; h < H; h++){
            for(int w=0; w < W; w++){
                cin >> map[w][h];
            }
        }
        dfs(shots);
        cout << "#" << tc << " " << ans << '\n';
    }
    return 0;
}

Comments

실수가 많아서 오래걸렸다.
구현 자체는 어렵지 않은 문제

댓글