문제 링크 : https://www.acmicpc.net/problem/14500

 

14500번: 테트로미노

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

www.acmicpc.net

 

 

처음엔 대칭도 가능하다는 것을 못보고 맞왜틀 하고있었는데

대칭이 가능하단걸 알고 추가 해주니 맞았다.

 

문제 접근

1. 3차원배열에 가능한 테트노미로의 모양을 다 저장해놓았다.

 ttrmn[19][5][2]

- 19 : 가능한 도형의 모양 9개

- 5 : 블럭4개 + 그 도형의 세로, 가로길이를 넣어줄 마지막 인덱스 1개

- 2 : y좌표, x좌표

 

2. 반복문으로 모든 경우의 수의 합을 구하고 그중 가장 큰 값 출력하였다.

 

 

 

소스코드

#include <iostream>

 

using namespace std;

 

int n, m, max_sum = 0;

int map[500][500];

 

int ttrmn[19][5][2= {

 

{ {0,0}, {0,1}, {1,0}, {1,1}, {2,2} },

 

{ {0,0}, {0,1}, {0,2}, {0,3}, {1,4} },

{ {0,0}, {1,0}, {2,0}, {3,0}, {4,1} },

 

{ {0,0}, {1,0}, {2,0}, {2,1}, {3,2} },

{ {0,0}, {0,1}, {0,2}, {1,0}, {2,3} },

{ {0,0}, {0,1}, {1,1}, {2,1}, {3,2} },

{ {0,2}, {1,0}, {1,1}, {1,2}, {2,3} },

 

{ {0,1}, {1,1}, {2,0}, {2,1}, {3,2} },

{ {0,0}, {1,0}, {1,1}, {1,2}, {2,3} },

{ {0,0}, {0,1}, {1,0}, {2,0}, {3,2} },

{ {0,0}, {0,1}, {0,2}, {1,2}, {2,3} },

 

{ {0,0}, {1,0}, {1,1}, {2,1}, {3,2} },

{ {0,1}, {0,2}, {1,0}, {1,1}, {2,3} },

{ {0,1}, {1,0}, {1,1}, {2,0}, {3,2} },

{ {0,0}, {0,1}, {1,1}, {1,2}, {2,3} },

 

{ {0,0}, {0,1}, {0,2}, {1,1}, {2,3} },

{ {0,1}, {1,0}, {1,1}, {2,1}, {3,2} },

{ {0,1}, {1,0}, {1,1}, {1,2}, {2,3} },

{ {0,0}, {1,0}, {1,1}, {2,0}, {3,2} }

 

};

 

int main()

{

    cin >> n >> m;

    

    for (int i = 0; i < n; i++) {

        for (int j = 0; j < m; j++) {

            cin >> map[i][j];

        }

    }

    

    for (int t = 0; t < 19; t++) {

        for (int i = 0; i < n - ttrmn[t][4][0+ 1; i++) {

            for (int j = 0; j < m - ttrmn[t][4][1+ 1; j++) {

                int sum = 0;

                for (int k = 0; k < 4; k++) {

                    sum += map[i + ttrmn[t][k][0]][j + ttrmn[t][k][1]];

                }

                if (max_sum < sum)

                    max_sum = sum;

            }

        }

    }

 

    cout << max_sum;

 

}

'Algorithm > 백준' 카테고리의 다른 글

백준 14503번 로봇 청소기  (0) 2019.04.27
백준 14888번 연산자 끼워넣기  (0) 2019.04.27
백준 13460번 구슬 탈출 2  (0) 2019.03.08
백준 2407 조합  (0) 2019.02.26
백준 10974 모든 순열  (0) 2019.02.25

+ Recent posts