[BOJ] 14500 : 테트로미노
풀이
시뮬레이션
삼성기출 변형문제.
(소스코드 눈어지러움 주의)
좌표마다 숫자가 있는데 합이 가장큰 숫자를 찾는 문제이다.
모든 좌표를 한번 순회하면서 좌표마다 가능한 테트리스블록(19개)의 합을 구해서 갱신했다.
가능한 블록을 쭉 그려본다음 그냥 sum=첫번째 두번쨰 세번쨰 네번째 이렇게 구했다.
그런데 좌표가 튀어나가는 예외처리를 해야되는데 상당히 귀찮아서 특수한 방법을 사용했다.
좌표를 주어진 최대사이즈인 500이 아니라 왼쪽+3 오른쪽+3 위+3 아래+3 크게 잡은뒤,
제일 처음에 좌표를 아주큰 음수로 초기화했다. (최대 많이 튀어나가봤자 3개 튀어나갈것이므로)
그래서 만약에 좌표를 튀어나간값이 있다면 음수가 될것이므로 최대값에 포함되지 않게 했다.
오늘, 좀 똑똑했다 (뿌듯)
코드
#include <iostream>
#include <queue>
#include <deque>
#include <vector>
#include <cstring>
using namespace std;
int arr[506][506];
//1 : 일자 2종류
//2 : 네모 1종류
//3 : L자 8종류
//4 : 꼬불이 4종류
//5 : 뻐큐 4종류
//총 19종류
int go(int i,int j,int type) {
int sum = 0;
if (type == 0) {
sum = arr[i][j] + arr[i][j + 1] + arr[i][j + 2] + arr[i][j + 3];
}
else if (type == 1) {
sum = arr[i][j] + arr[i + 1][j] + arr[i + 2][j] + arr[i + 3][j];
}
else if (type == 2) {
sum = arr[i][j] + arr[i + 1][j] + arr[i][j+1] + arr[i + 1][j+1];
}
else if (type == 3) {
sum = arr[i][j] + arr[i+1][j] + arr[i+2][j] + arr[i+2][j+1];
}
else if (type == 4) {
sum = arr[i][j] + arr[i][j+1] + arr[i-1][j+1] + arr[i-2][j+1];
}
else if (type == 5) {
sum = arr[i][j] + arr[i][j+1] + arr[i+1][j+1] + arr[i+2][j+1];
}
else if (type == 6) {
sum = arr[i][j] + arr[i][j-1] + arr[i+1][j-1] + arr[i+2][j-1];
}
else if (type == 7) {
sum = arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i-1][j+2];
}
else if (type == 8) {
sum = arr[i][j] + arr[i+1][j] + arr[i+1][j+1] + arr[i+1][j+2];
}
else if (type == 9) {
sum = arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+2];
}
else if (type == 10) {
sum = arr[i][j] + arr[i-1][j] + arr[i-1][j+1] + arr[i-1][j+2];
}
else if (type == 11) {
sum = arr[i][j] + arr[i+1][j] + arr[i+1][j+1] + arr[i+2][j+1];
}
else if (type == 12) {
sum = arr[i][j] + arr[i+1][j] + arr[i+1][j-1] + arr[i+2][j-1];
}
else if (type == 13) {
sum = arr[i][j] + arr[i][j+1] + arr[i-1][j+1] + arr[i-1][j+2];
}
else if (type == 14) {
sum = arr[i][j] + arr[i][j+1] + arr[i+1][j+1] + arr[i+1][j+2];
}
else if (type == 15) {
sum = arr[i][j] + arr[i][j+1] + arr[i+1][j+1] + arr[i][j+2];
}
else if (type == 16) {
sum = arr[i][j] + arr[i][j+1] + arr[i+1][j+1] + arr[i-1][j+1];
}
else if (type == 17) {
sum = arr[i][j] + arr[i+1][j] + arr[i+1][j+1] + arr[i+1][j-1];
}
else if (type == 18) {
sum = arr[i][j] + arr[i+1][j] + arr[i+1][j+1] + arr[i+2][j];
}
return sum;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m;
cin >> n >> m;
//범위체크 하기 귀찮아져서
//처음에 엄청작은값을 넣어둬서 튀어나가면 알아서 최대값이 안되게한다.
for (int i = 0; i < 506; i++) {
for (int j = 0; j < 506; j++) {
//최대 많이튀어나가면 3개
arr[i][j] = -700000000;
}
}
for (int i = 3; i < n+3; i++) {
for (int j = 3; j < m+3; j++) {
cin >> arr[i][j];
}
}
int ans = 0;
//1-1
for (int i = 3; i < n+3; i++) {
for (int j = 3; j < m+3; j++) {
int sum = 0;
for (int k = 0; k < 19; k++) {
sum = go(i,j,k);
//cout << "i,j,k,sum : " << i << ' ' << j << ' ' << k << ' ' << sum << '\n';
if (ans < sum)
ans = sum;
}
}
}
cout << ans;
return 0;
}
Written on April 12, 2019