본문 바로가기
CS/Algorithm

[BOJ][C++] 14500 테트로미노

by 별토끼. 2019. 2. 21.
반응형

[BOJ][C++] 14500 테트로미노

 

문제

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

 

풀이

테트리스 모형대로 DFS 탐색을 해줍니다.

DFS로 탐색할 때 사방 모두를 탐색하기 위해서 백트래킹을 이용했습니다.

그리고 ㅗㅓㅏㅜ만 따로 만들어서 탐색해주면 돼요. 이 때, 중앙 값을 기준으로 세 방면을 더해주고 maxVal과 비교하는 식으로 구했어요.

 

코드

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>
using namespace std;
int n, m;
int map[500][500];
bool visited[500][500];
int maxVal = 0;
int dx[] = { -1,0,1,0,-1,0 };
int dy[] = { 0,-1,0,1,0,-1 };
void AnotherCase(int x, int y, int cnt, int val) {
    //방향
    
    for (int i = 0; i < 4; i++) {
        int tmpval = val;
        int tmpcnt = cnt;
        for (int j = i; j <= i+2; j++) {
            int nx = x + dx[j];
            int ny = y + dy[j];
            if (nx < 0 || ny < 0 || nx >= n || ny >= m) break;
            tmpcnt++;
            tmpval += map[nx][ny];
        }
        if ((maxVal < tmpval) && tmpcnt==4) {
            maxVal = tmpval;
        }
    }
}
void DFS(int x, int y, int cnt, int val) {
    
    if (cnt == 4) {
        if (maxVal < val) {
            maxVal = val;
        }
        return;
    }
    
    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) continue;
        if (visited[nx][ny] == false) {
        visited[nx][ny] = true;
        val += map[nx][ny];
        DFS(nx, ny, cnt + 1, val);
        val -= map[nx][ny];
        visited[nx][ny] = false;
        }

    }
}
int main() {
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            visited[i][j] = false;
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d", &map[i][j]);
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            visited[i][j] = true;
            DFS(i, j, 1, map[i][j]);
            AnotherCase(i, j, 1, map[i][j]);
            visited[i][j] = false;
        }
    }
    printf("%d\n", maxVal);
}

 

반응형

'CS > Algorithm' 카테고리의 다른 글

[SWEA][C++] 1767 프로세서 연결하기  (0) 2019.03.07
[BOJ][C++] 15662 톱니바퀴(2)  (0) 2019.02.25
[BOJ][C++] 16235 나무재테크  (0) 2019.02.16
[BOJ][C++] 1966 프린터 큐  (0) 2019.02.01
[Programmers][C++] 43165 타겟 넘버  (0) 2019.01.31

댓글