HyeLog
14500_테트로미노 본문
단번에 풀이가 생각나는 문제는 아니었다.
테트로미노 5가지 중 4가지(대칭, 회전 포함)는 모두 재귀함수로 깊이 3까지 탐색하고, 'ㅏ,ㅓ,ㅗ,ㅜ'는 따로 계산하는 방식으로 풀었다.
#include <iostream>
#include <cstring>
#define MAX 500
using namespace std;
int n, m;
int a[MAX][MAX];
int tmp, ans;
int dx[] = { 0,0,-1,1 };
int dy[] = { -1,1,0,0 };
bool visited[MAX][MAX];
void solve(int x, int y, int sum, int cnt) {
visited[x][y] = true;
if (cnt == 3) {
if (sum > ans) ans = sum;
return;
}
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < n && ny >= 0 && ny < m) {
if (!visited[nx][ny]) {
solve(nx, ny, sum + a[nx][ny], cnt + 1);
visited[nx][ny] = false;
}
}
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
for (int i = 0; i < n; i++) { // 나머지 모양
for (int j = 0; j < m; j++) {
memset(visited, false, sizeof(visited));
solve(i, j, a[i][j], 0);
}
}
for (int i = 0; i < n; i++) { // ㅏ 모양
for (int j = 0; j < m; j++) {
if (i - 1 >= 0 && i + 1 < n && j - 1 >= 0) {
tmp = a[i][j] + a[i - 1][j - 1] + a[i][j - 1] + a[i + 1][j - 1];
if (tmp > ans) ans = tmp;
}
}
}
for (int i = 0; i < n; i++) { // ㅗ 모양
for (int j = 0; j < m; j++) {
if (i + 1 < n && j - 1 >= 0 && j + 1 < m) {
tmp = a[i][j] + a[i + 1][j - 1] + a[i + 1][j] + a[i + 1][j + 1];
if (tmp > ans) ans = tmp;
}
}
}
for (int i = 0; i < n; i++) { // ㅜ 모양
for (int j = 0; j < m; j++) {
if (i - 1 >= 0 && j - 1 >= 0 && j + 1 < m) {
tmp = a[i][j] + a[i - 1][j - 1] + a[i - 1][j] + a[i - 1][j + 1];
if (tmp > ans) ans = tmp;
}
}
}
for (int i = 0; i < n; i++) { // ㅓ 모양
for (int j = 0; j < m; j++) {
if (i - 1 >= 0 && i + 1 < n && j + 1 < m) {
tmp = a[i][j] + a[i - 1][j + 1] + a[i][j + 1] + a[i + 1][j + 1];
if (tmp > ans) ans = tmp;
}
}
}
cout << ans << '\n';
return 0;
}
'알고리즘' 카테고리의 다른 글
9095_1, 2, 3 더하기 (0) | 2023.01.05 |
---|---|
1748_수 이어 쓰기 1 (0) | 2023.01.05 |
1107_리모컨 (0) | 2023.01.04 |
2309_일곱 난쟁이 (0) | 2022.12.23 |
1476_날짜 계산 (0) | 2022.12.23 |