본문 바로가기

카테고리 없음

[boj] 백준 14500 테트로미노 - dfs, 브루트포스

[문제]

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

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변

www.acmicpc.net

 

[풀이]

처음에는 dfs 문제구나 싶어서 단순하게 풀었다가 뒤늦게 ㅜ 모양의 테트로미노가 dfs로 불가능하다는 걸 깨달았다. 따라서 나머지는 depth가 4인 dfs로 해결하고, 예외인 ㅜ 모양에 대해 ㅜ, ㅗ, ㅏ, ㅓ 모두 고려해서 브루트포스로 조건을 걸어 해결하면 된다. 

 

[코드]

 

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace::std;

int n, m, sum;
int map[500][500];
int visited[500][500];
int answer = -987654321;
int dx[] = {0, 0, -1, 1};
int dy[] = {1, -1, 0, 0};

void dfs(int r, int c, int depth, int sum){
    if(depth==3){
        answer = max(answer, sum);
        return;
    }

    for(int i=0; i<4; i++){
        int nr = r + dx[i];
        int nc = c + dy[i];

        if(nr<0 || nr>=n || nc<0 || nc>=m || visited[nr][nc])
            continue;
        visited[nr][nc] = true;
        dfs(nr, nc, depth+1, sum+map[nr][nc]);
        visited[nr][nc] = false;
    }

}

void shape1(int r, int c){ //ㅗ
    int tmp = 0;
    tmp = map[r][c]  + map[r][c+1] + map[r][c+2] + map[r-1][c+1];
    answer = max(answer, tmp);
};

void shape2(int r, int c){ //ㅜ
    int tmp = 0;
    tmp = map[r][c] + map[r][c+1] + map[r][c+2] + map[r+1][c+1];
    answer = max(answer, tmp);

}

void shape3(int r, int c){ //ㅏ
    int tmp = 0;
    tmp = map[r][c] + map[r+1][c] + map[r-1][c] + map[r][c+1];
    answer = max(answer, tmp);
}

void shape4(int r, int c){ //ㅓ
    int tmp = 0;
    tmp = map[r][c] + map[r][c+1] + map[r-1][c+1] + map[r+1][c+1];
    answer = max(answer, tmp);
}

int main() {
    //테트로미노 최대값
    cin >> n >> m;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            cin >> map[i][j];
        }
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            visited[i][j] = true;
            dfs(i, j, 0, map[i][j]);
            visited[i][j] = false;
            if (i - 1 >= 0 && j + 2 < m) shape1(i, j); //ㅗ
            if (j + 2 < m && i + 1 < n) shape2(i, j); //ㅜ
            if (i + 1 < n && i - 1 >= 0 && j + 1 < m) shape3(i, j); //ㅏ
            if (i + 1 < n && i - 1 >= 0 && j + 1 < m) shape4(i, j); //ㅓ
        }
    }

    cout << answer;

}