반응형
https://www.acmicpc.net/problem/14500
14500번: 테트로미노
폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변
www.acmicpc.net
문제를 보면 4개의 이어지는 칸의 합이 최대인 값을 구하면 됩니다.
우리가 사용할 수 있는 모양을 보면 테트리스 조각이랑 똑같은데 T블록( ㅗ블록) 을 제외한 나머지 블록들은 간단히 DFS를 사용하면 모든 경우를 구할 수 있습니다.
T블록의 경우는 따로 분리해서 코드를 작성해주면 됩니다.
각 칸의 숫자는 1000을 넘지 않는 자연수이므로 int 범위에서도 충분합니다.
#include<iostream>
#include<utility>
using namespace std;
using ll = long long;
int board[501][501];
bool visited[501][501];
pair<int, int>dir[4] = { {1,0},{0,1}, {-1,0} ,{0,-1} };
int n, m;
int dfs(int x, int y, int depth) {
if (depth == 4) return board[x][y];
int ret = 0;
visited[x][y] = true;
for (int i = 0; i < 4; i++) {
int nx = x + dir[i].first;
int ny = y + dir[i].second;
if (nx >= 0 && ny >= 0 && nx < n && ny < m && !visited[nx][ny]) {
ret = max(ret, dfs(nx, ny, depth + 1));
visited[nx][ny] = false;
}
}
visited[x][y] = false;
return board[x][y] + ret;
}
int TBlock(int x, int y) { // T블럭은 따로 분리하여 작성
int ret = 0;
if (x + 1 < n && y - 1 >= 0 && y + 1 < m)
ret = max(ret, board[x][y] + board[x + 1][y] + board[x][y - 1] + board[x][y + 1]);//ㅜ
if (x + 1 < n && x - 1 >= 0 && y + 1 < m)
ret = max(ret, board[x][y] + board[x + 1][y] + board[x - 1][y] + board[x][y + 1]);//ㅏ
if (x - 1 >= 0 && y - 1 >= 0 && y + 1 < m)
ret = max(ret, board[x][y] + board[x - 1][y] + board[x][y - 1] + board[x][y + 1]);//ㅗ
if (x + 1 < n && x - 1 >= 0 && y - 1 >= 0)
ret = max(ret, board[x][y] + board[x + 1][y] + board[x - 1][y] + board[x][y - 1]);//ㅓ
return ret;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int ans = 0;
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> board[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
ans = max(ans, dfs(i, j, 1));
ans = max(ans, TBlock(i, j));
}
}
cout << ans;
return 0;
}
반응형
'PS > BOJ 백준' 카테고리의 다른 글
백준 12865 평범한 배낭 (배낭 문제) (0) | 2023.08.25 |
---|---|
[백준 / BOJ] 11718번 : 그대로 출력하기 (C++) (0) | 2021.08.24 |
[백준 / BOJ] 16953번 : A => B (C++) (0) | 2021.08.23 |
[백준 / BOJ] 11725번 : 트리의 부모 찾기 (C++) (0) | 2021.08.19 |