티스토리 뷰
백준 14500번 : 테트로미노
등급 : Gold IV
사용 알고리즘 : Brute-Force, DFS, Backtracking
사용 자료구조 : Vector
DFS와 백트래킹, 그리고 예외 케이스에 대한 탐색으로 구현할 수 있다.
위의 사진을 보았을 때, 테트로미노의 5개의 도형 중 마지막 도형만 제외하면 모두 DFS로 탐색이 가능하다.
즉, 5번째 도형 = 예외 케이스.
이 부분만 유의하면 어렵지 않게 구현이 가능하다.
#include <iostream>
#include <vector>
using namespace std;
int n, m;
int ans = 0;
vector <vector <int>> v;
bool visit[500][500] = { false };
int dx[4] = { -1, 1, 0, 0 };
int dy[4] = { 0, 0, -1, 1 };
void dfs(int x, int y, int num, int val)
{
if (num == 4)
{
ans = max(ans, val);
return;
}
// 블록이 4개가 되었을 때 최댓값과 비교하고 탈출
visit[x][y] = true;
for (int i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && ny >= 0 && nx < n && ny < m)
{
if (!visit[nx][ny])
{
dfs(nx, ny, num + 1, val + v[nx][ny]);
visit[nx][ny] = false;
// 백트래킹을 위하여 탐색한 블록을 다시 미탐색으로 변경
}
}
}
}
int main()
{
cin.tie(0);
ios_base::sync_with_stdio(false);
cin >> n >> m;
v.resize(n, vector<int>(m));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> v[i][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
fill_n(visit[0], 250000, false);
dfs(i, j, 1, v[i][j]);
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (i <= n - 2 && j >= 1 && j <= m - 2) ans = max(ans, v[i][j] + v[i][j + 1] + v[i][j - 1] + v[i + 1][j]);
if (i >= 1 && j >= 1 && j <= m - 2) ans = max(ans, v[i][j] + v[i][j + 1] + v[i][j - 1] + v[i - 1][j]);
if (i >= 1 && i <= n - 2 && j <= m - 2) ans = max(ans, v[i][j] + v[i + 1][j] + v[i - 1][j] + v[i][j + 1]);
if (i >= 1 && i <= n - 2 && j >= 1) ans = max(ans, v[i][j] + v[i + 1][j] + v[i - 1][j] + v[i][j - 1]);
// 예외 케이스인 5번째 모양을 탐색하기 위해 v[i][j]의 상하좌우 중 하나를 제외하고 모두 합한 모양의 값을 비교.
}
}
cout << ans;
}
'알고리즘 > 코딩테스트' 카테고리의 다른 글
[백준] 13460번 : 구슬 탈출 2 - C++ (0) | 2022.11.21 |
---|---|
[백준] 2473번 : 세 용액 - C++ (0) | 2022.11.10 |
[백준] 3020번 : 개똥벌레 - C++ (0) | 2022.10.26 |
[백준] 2110번 : 공유기 설치 - C++ (0) | 2022.10.18 |
[백준] 11559번 : Puyo Puyo - C++ (0) | 2022.10.18 |
댓글