Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

혼종 꼬지마루

[백준] 14500 - 테트로미노 본문

Algorithms/DFS

[백준] 14500 - 테트로미노

꼬지마루 2018. 8. 28. 09:39

이 문제 역시 삼성기출로 나왔다는 문제


문제에서 주어진 테트로미노를 검사하고, 그 영역안에 값을 모두 더했을 때 최대값을 구하는 문제


인접한 4개를 고르는 것이기 때문에 dfs로 4개를 골라 검사해주면 끝


하지만, 주어진 테트로미노 중 ㅏ모양과 이를 회전시킨 ㅗ ㅓ ㅜ 까지 총 4개는 따로 검사해야 한다


1. dfs로 4개를 골라 최대값을 찾는다


2. 그 지점에서 ㅏ ㅗ ㅓ ㅜ 4개의 모양을 검사하여 최대값을 찾는다


1번 같은 경우는 사실 너무 정형화된 형태라 세부 코딩만 다르고 왠만하면 모두 똑같이 풀 수 있다


하지만 2번같은 경우는 사람마다 더 효율적인 코딩이 되도록 짤수도 있고, 그냥 나처럼 방향 모두 구하고 범위검사하고 해도 시간은 충분하다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#define MX 502
using namespace std;
 
int map[MX][MX], check[MX][MX];
int dx[] = { 10-1};
int dy[] = { 0-10};
int N, M, dab;
 
void dfs(int d, int x, int y, int sum)
{
    if (d == 4)
    {
        if (sum > dab) dab = sum;
        return;
    }
    for (int i = 0; i < 4; i++)
    {
        int nx = x + dx[i], ny = y + dy[i];
        if (nx < || ny < || nx >= M || ny >= N || check[ny][nx]) continue;
        check[ny][nx] = 1;
        dfs(d + 1, nx, ny, sum + map[ny][nx]);
        check[ny][nx] = 0;
    }
}
 
int main(void)
{
    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++)
        {
            check[i][j] = 1;
            dfs(1, j, i, map[i][j]);
            check[i][j] = 0;
            int x1, x2, x3, y1, y2, y3, d1, d2, d3;
            for (int d = 0; d < 4; d++)
            {
                d1 = d; d2 = d + 1; d3 = d + 2;
                if (d2 > 3) d2 -= 4;
                if (d3 > 3) d3 -= 4;
                x1 = j + dx[d1]; y1 = i + dy[d1]; x2 = j + dx[d2]; y2 = i + dy[d2]; x3 = j + dx[d3]; y3 = i + dy[d3];
                if (x1 < || y1 < || x1 >= M || y1 >= N || x2 < || y2 < || x2 >= M || y2 >= N || x3 < || y3 < || x3 >= M || y3 >= N) continue;
                if (map[i][j] + map[y1][x1] + map[y2][x2] + map[y3][x3] > dab) dab = map[i][j] + map[y1][x1] + map[y2][x2] + map[y3][x3];
            }
        }
    cout << dab << endl;
    return 0;
}
cs

'Algorithms > DFS' 카테고리의 다른 글

[SWEA] 4223 - 삼성이의 트라우마  (0) 2018.09.08
[백준] 14889 - 스타트와 링크  (0) 2018.09.07
[백준] 9997 - 폰트  (0) 2018.08.31
[백준] 1208 - 부분집합의 합2  (0) 2018.08.29
[백준] 15660 - 테트로미노(2)  (1) 2018.08.28