꾸르꾸르

[BOJ] 14500번 테트로미노 문제풀이 (C++) 본문

코딩, 알고리즘, 문제풀이/BOJ 백준

[BOJ] 14500번 테트로미노 문제풀이 (C++)

GGUGGU- 2019. 5. 12. 20:59

2017.10.4 에 작성된 글입니다.


 

문제링크

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

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변끼리 연결되어 있어야 한다. 즉, 꼭짓점과 꼭짓점만 맞닿아 있으면 안 된다. 정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다. 아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. 종이는 1×1 크기의 칸으로 나누

www.acmicpc.net

 

풀이방법

답은 하드 코딩

그냥 시키는대로 하면 됩니다.

테트리스 모양 모두 만들어서 돌려주면 됨

 

소스 코드

#include <iostream>
 
using namespace std;
 
int map[505][505] = { 0 };
 
int max(int a, int b)
{
    return a > b ? a : b;
}
 
int Check(int cur_x, int cur_y)
{
    int max_value = 0;
    //ㅁㅁㅁㅁ
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x][cur_y + 1] + map[cur_x][cur_y + 2] + map[cur_x][cur_y + 3]);//가로
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x + 1][cur_y] + map[cur_x + 2][cur_y] + map[cur_x + 3][cur_y]);//세로
 
    //ㅁㅁ
    //ㅁㅁ
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x + 1][cur_y] + map[cur_x][cur_y + 1] + map[cur_x + 1][cur_y + 1]);//네모
 
    //ㅁㅁㅁ
    //ㅁ
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x + 1][cur_y] + map[cur_x][cur_y + 1] + map[cur_x][cur_y + 2]);
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x][cur_y + 1] + map[cur_x][cur_y + 2] + map[cur_x - 1][cur_y + 2]);
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x + 1][cur_y] + map[cur_x + 2][cur_y] + map[cur_x + 2][cur_y + 1]);
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x][cur_y + 1] + map[cur_x + 1][cur_y + 1] + map[cur_x + 2][cur_y + 1]);
 
    //ㅁㅁㅁ
    //    ㅁ
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x][cur_y + 1] + map[cur_x][cur_y + 2] + map[cur_x + 1][cur_y + 2]);
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x + 1][cur_y] + map[cur_x + 2][cur_y] + map[cur_x + 2][cur_y - 1]);
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x + 1][cur_y] + map[cur_x + 1][cur_y + 1] + map[cur_x + 1][cur_y + 2]);
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x][cur_y + 1] + map[cur_x + 1][cur_y] + map[cur_x + 2][cur_y]);
 
    //  ㅁㅁ
    //ㅁㅁ
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x][cur_y + 1] + map[cur_x + 1][cur_y] + map[cur_x + 1][cur_y - 1]);
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x + 1][cur_y] + map[cur_x + 1][cur_y + 1] + map[cur_x + 2][cur_y + 1]);
 
    //ㅁㅁ
    //  ㅁㅁ
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x][cur_y + 1] + map[cur_x + 1][cur_y + 1] + map[cur_x + 1][cur_y + 2]);
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x + 1][cur_y] + map[cur_x + 1][cur_y - 1] + map[cur_x + 2][cur_y - 1]);
 
    //  ㅁ
    //ㅁㅁㅁ
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x - 1][cur_y] + map[cur_x][cur_y - 1] + map[cur_x][cur_y + 1]);
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x - 1][cur_y] + map[cur_x + 1][cur_y] + map[cur_x][cur_y + 1]);
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x][cur_y + 1] + map[cur_x][cur_y - 1] + map[cur_x + 1][cur_y]);
    max_value = max(max_value, map[cur_x][cur_y] + map[cur_x - 1][cur_y] + map[cur_x + 1][cur_y] + map[cur_x][cur_y - 1]);
 
    return max_value;
}
 
int main()
{
    int N, M;
    int Answer = 0;
    cin >> N >> M;
 
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= M; j++)
            cin >> map[i][j];
    
    //배열의 각 해당점에서 모든 도형의 넓이 체크
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= M; j++)//
            Answer = max(Answer, Check(i, j));//제일 큰값을 출력 
 
    cout << Answer << endl;
 
    return 0;
}

 

참고

해당 문제는 2017년 상반기에 출제된 문제.

퇴사와 함께 나왔습니다.

Comments