https://www.acmicpc.net/problem/14500
그냥 무지성으로 모든 회전, 대칭을 고려한 테트리스 블록을 구현하고 모든 부분에 적용시켜서 푸는 방식으로 진행했다. 다만 이렇게 하니까 오류 날 확률도 높고 시간도 오래걸려서 다음에는 회전, 대칭은 하드 코딩하지 않고 진행하는 방식으로 해야할 것 같다.
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<utility>
using namespace std;
int n, m;
int result = 0;
int temp_result = 0;
vector<vector<int>> matrix(550, vector<int>(550, 0));
vector<vector<pair<int, int>>> I_mino(2, vector<pair<int, int>>(4, make_pair(0, 0)));
vector<vector<pair<int, int>>> O_mino(1, vector<pair<int, int>>(4, make_pair(0, 0)));
vector<vector<pair<int, int>>> Z_mino(4, vector<pair<int, int>>(4, make_pair(0, 0)));
vector<vector<pair<int, int>>> J_mino(8, vector<pair<int, int>>(4, make_pair(0, 0)));
vector<vector<pair<int, int>>> T_mino(4, vector<pair<int, int>>(4, make_pair(0, 0)));
int main() {
// 노가다로 모든 경우의수 구해주기
I_mino[0][0] = make_pair(0, 0);
I_mino[0][1] = make_pair(0, 1);
I_mino[0][2] = make_pair(0, 2);
I_mino[0][3] = make_pair(0, 3);
I_mino[1][0] = make_pair(0, 0);
I_mino[1][1] = make_pair(1, 0);
I_mino[1][2] = make_pair(2, 0);
I_mino[1][3] = make_pair(3, 0);
O_mino[0][0] = make_pair(0, 0);
O_mino[0][1] = make_pair(0, 1);
O_mino[0][2] = make_pair(1, 0);
O_mino[0][3] = make_pair(1, 1);
Z_mino[0][0] = make_pair(0, 0);
Z_mino[0][1] = make_pair(0, 1);
Z_mino[0][2] = make_pair(1, 1);
Z_mino[0][3] = make_pair(1, 2);
Z_mino[1][0] = make_pair(0, 0);
Z_mino[1][1] = make_pair(1, 0);
Z_mino[1][2] = make_pair(1, -1);
Z_mino[1][3] = make_pair(2, -1);
Z_mino[2][0] = make_pair(0, 0);
Z_mino[2][1] = make_pair(0, 1);
Z_mino[2][2] = make_pair(-1, 1);
Z_mino[2][3] = make_pair(-1, 2);
Z_mino[3][0] = make_pair(0, 0);
Z_mino[3][1] = make_pair(-1, 0);
Z_mino[3][2] = make_pair(-1, -1);
Z_mino[3][3] = make_pair(-2, -1);
J_mino[0][0] = make_pair(0, 0);
J_mino[0][1] = make_pair(0, 1);
J_mino[0][2] = make_pair(0, 2);
J_mino[0][3] = make_pair(1, 2);
J_mino[1][0] = make_pair(0, 0);
J_mino[1][1] = make_pair(0, 1);
J_mino[1][2] = make_pair(0, 2);
J_mino[1][3] = make_pair(-1, 2);
J_mino[2][0] = make_pair(0, 0);
J_mino[2][1] = make_pair(0, 1);
J_mino[2][2] = make_pair(0, 2);
J_mino[2][3] = make_pair(1, 0);
J_mino[3][0] = make_pair(0, 0);
J_mino[3][1] = make_pair(0, 1);
J_mino[3][2] = make_pair(0, 2);
J_mino[3][3] = make_pair(-1, 0);
J_mino[4][0] = make_pair(0, 0);
J_mino[4][1] = make_pair(1, 0);
J_mino[4][2] = make_pair(2, 0);
J_mino[4][3] = make_pair(2, 1);
J_mino[5][0] = make_pair(0, 0);
J_mino[5][1] = make_pair(1, 0);
J_mino[5][2] = make_pair(2, 0);
J_mino[5][3] = make_pair(2, -1);
J_mino[6][0] = make_pair(0, 0);
J_mino[6][1] = make_pair(1, 0);
J_mino[6][2] = make_pair(2, 0);
J_mino[6][3] = make_pair(0, 1);
J_mino[7][0] = make_pair(0, 0);
J_mino[7][1] = make_pair(1, 0);
J_mino[7][2] = make_pair(2, 0);
J_mino[7][3] = make_pair(0, -1);
T_mino[0][0] = make_pair(0, 0);
T_mino[0][1] = make_pair(1, 0);
T_mino[0][2] = make_pair(2, 0);
T_mino[0][3] = make_pair(1, 1);
T_mino[1][0] = make_pair(0, 0);
T_mino[1][1] = make_pair(1, 0);
T_mino[1][2] = make_pair(2, 0);
T_mino[1][3] = make_pair(1, -1);
T_mino[2][0] = make_pair(0, 0);
T_mino[2][1] = make_pair(0, 1);
T_mino[2][2] = make_pair(0, 2);
T_mino[2][3] = make_pair(1, 1);
T_mino[3][0] = make_pair(0, 0);
T_mino[3][1] = make_pair(0, 1);
T_mino[3][2] = make_pair(0, 2);
T_mino[3][3] = make_pair(-1, 1);
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
scanf(" %d", &matrix[i][j]);
}
}
for (int i = 1; i <= n; i++) { // 특정 위치에서
for (int j = 1; j <= m; j++) {
for (int k = 0; k < I_mino.size(); k++) { // 각 미노 확인 I
temp_result = 0; // 초기화
for (int l = 0; l < I_mino[k].size(); l++) { // L 임
// 각 미노를 회전, 대칭하면서 가능한 위치인지 확인
int x = i + I_mino[k][l].first;
int y = j + I_mino[k][l].second;
if (1 <= x && x <= n) {
if (1 <= y && y <= m) {
temp_result += matrix[x][y];
if (l == I_mino[k].size() - 1) {
result = max(temp_result, result);
}
else {
continue; // 맞으면 지속
}
}
}
break; // 아니면 탈출
}
}
for (int k = 0; k < O_mino.size(); k++) { // 각 미노 확인 O
temp_result = 0; // 초기화
for (int l = 0; l < O_mino[k].size(); l++) { // L 임
// 각 미노를 회전, 대칭하면서 가능한 위치인지 확인
int x = i + O_mino[k][l].first;
int y = j + O_mino[k][l].second;
if (1 <= x && x <= n) {
if (1 <= y && y <= m) {
temp_result += matrix[x][y];
if (l == O_mino[k].size() - 1) {
result = max(temp_result, result);
}
else {
continue; // 맞으면 지속
}
}
}
break; // 아니면 탈출
}
}
for (int k = 0; k < Z_mino.size(); k++) { // 각 미노 확인 Z
temp_result = 0; // 초기화
for (int l = 0; l < Z_mino[k].size(); l++) { // L 임
// 각 미노를 회전, 대칭하면서 가능한 위치인지 확인
int x = i + Z_mino[k][l].first;
int y = j + Z_mino[k][l].second;
if (1 <= x && x <= n) {
if (1 <= y && y <= m) {
temp_result += matrix[x][y];
if (l == Z_mino[k].size() - 1) {
result = max(temp_result, result);
}
else {
continue; // 맞으면 지속
}
}
}
break; // 아니면 탈출
}
}
for (int k = 0; k < J_mino.size(); k++) { // 각 미노 확인 J
temp_result = 0; // 초기화
for (int l = 0; l < J_mino[k].size(); l++) { // L 임
// 각 미노를 회전, 대칭하면서 가능한 위치인지 확인
int x = i + J_mino[k][l].first;
int y = j + J_mino[k][l].second;
if (1 <= x && x <= n) {
if (1 <= y && y <= m) {
temp_result += matrix[x][y];
if (l == J_mino[k].size() - 1) {
result = max(temp_result, result);
}
else {
continue; // 맞으면 지속
}
}
}
break; // 아니면 탈출
}
}
for (int k = 0; k < T_mino.size(); k++) { // 각 미노 확인 T
temp_result = 0; // 초기화
for (int l = 0; l < T_mino[k].size(); l++) { // L 임
// 각 미노를 회전, 대칭하면서 가능한 위치인지 확인
int x = i + T_mino[k][l].first;
int y = j + T_mino[k][l].second;
if (1 <= x && x <= n) {
if (1 <= y && y <= m) {
temp_result += matrix[x][y];
if (l == T_mino[k].size() - 1) {
result = max(temp_result, result);
}
else {
continue; // 맞으면 지속
}
}
}
break; // 아니면 탈출
}
}
}
}
printf("%d", result);
}