PS/백트래킹[Backtracking]

백준 14500 테트로미노(c++)

SeungbeomKim 2023. 1. 28. 17:47
반응형

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

 

14500번: 테트로미노

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

www.acmicpc.net

이 문제는 주어진 배열의 해당하는 값 4개를 더한 값들 중 최댓값을 구해야 하는 문제입니다. 

그렇지만, 예외처리 해줘야 하는 부분이 있습니다. ㅗ,ㅜ,ㅏ,ㅓ와 같은 테트로미노 모양은 DFS탐색이 불가능 합니다. 그래서 따로 함수를 만들어서 처리해줘야 하는 번거로움이 있습니다. 그 외에는 백트래킹으로 접근해서 테트로미노의 칸에 놓은 수들의 합의 최댓값을 구해주면 됩니다. 

더불어, 이 문제는 DFS 탐색으로 보기 어려운게, go 함수의 해당 인덱스를 false처리 해주기 때문에, 모든 경우의 수를 조사하는 백트래킹 문제로 봐야 합니다. 

 

<코드>

#include <iostream>
using namespace std;
int a[501][501];
bool check[501][501];
int n, m;
int mov[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
int ans = 0;
void go(int x, int y, int sum, int cnt)
{
    if (cnt == 4)
    {
        if (ans < sum)
            ans = sum;
        return;
    }

    if (x < 0 || x >= n || y < 0 || y >= m)
        return;
    if (check[x][y])
        return;
    check[x][y] = true;
    for (int k = 0; k < 4; k++)
    {
        go(x + mov[k][0], y + mov[k][1], sum + a[x][y], cnt + 1);
    }
    check[x][y] = false;
}
반응형

'PS > 백트래킹[Backtracking]' 카테고리의 다른 글

백준 N과 M (6) ~ (12) 복습  (0) 2023.02.11
백준 N과 M (1) ~ (5) 복습  (2) 2023.02.10
백준 6603 로또(c++)  (0) 2023.01.28
백트래킹(backtracking)  (0) 2022.08.10