https://www.acmicpc.net/problem/14500
이차원 배열로 주어지는 격자에서, 모든 테트로미노 모양을 다 넣어보면 된다.
주어지는 다섯개의 테트로미노를 회전 또는 대칭해서 얻을 수 있는 모양들까지 포함해서 계산해주면 된다.
가능한 모양은 총 19개이다.
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 | #include<iostream> #include<vector> using namespace std; int row, col, m[501][501]; int Max = -1; //가능한 모양은 총 19개이다 vector<int> vr[19] = { { 1,2,3 },{ 0,0,0 },{ 0,1,1 },{ 1,2,2 },{ 0,0,-1 },{ 0,1,2 },{ -1,-1,-1 },{ 0,0,1 },{ -1,0,1 },{ -1,0,0 },{ 1,1,2 },{ 1,1,2 }, { 0,-1,-1 },{ -1,-1,-2 },{ 0,1,1 },{ 0,-1,-2 },{ 1,1,1 },{ -1,-2,-2 },{ 0,0,1 } }; vector<int> vc[19] = { { 0,0,0 },{ 1,2,3 },{ 1,0,1 },{ 0,0,1 },{ 1,2,2 },{ 1,1,1 },{ 0,1,2 },{ 1, 2, 1 }, { 1,1,1 },{ 1,1,2 },{ 0,1,0 },{ 0,1,1 },{ 1,1,2 },{ 0,1,1 },{ 1,1,2 },{ 1,1,1 } ,{ 0,1,2 } ,{ 0,0,1 } ,{ 1,2,2 } }; void calculate() { int cnt = 0; for (int con = 0; con < 19; con++) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { int Sum = m[i][j]; bool isBreak = false; for (int k = 0; k < 3; k++) { int nr = i + vr[con][k]; int nc = j + vc[con][k]; if (nr < 0 || nc < 0 || nr >= row || nc >= col) { isBreak = true; break; } Sum += m[nr][nc]; } if (!isBreak) if (Sum > Max) Max = Sum; } } } } int main(void) { cin >> row >> col; for (int i = 0; i < row; i++) for (int j = 0; j < col; j++) cin >> m[i][j]; calculate(); cout << Max << '\n'; return 0; } | cs |
'알고리즘 문제 풀이 > 백준 온라인 저지' 카테고리의 다른 글
백준 2003번: 수들의 합 2 (C++) (0) | 2019.08.29 |
---|---|
백준 13458번: 시험 감독 (C++) (0) | 2019.08.29 |
백준 14503번: 로봇 청소기 (C++) (0) | 2019.08.28 |
백준 14888번: 연산자 끼워넣기 (C++) (0) | 2019.08.27 |
백준 11328번 Strfry (C++) (0) | 2019.08.25 |