[14500] 테트로미노
풀이
모든 경우를 배열에 저장해주고 모두 확인하면 됩니다. 모든 가능한 테트로미노를 그리고 4칸 중 한 칸을 기준으로 나머지 3칸의 상대적 좌표를 배열로 저장합니다. 배열의 인덱스가 벗어나는 것은 자동으로 체크할 수 있게 짭니다.
코드
#include <cstdio>
#define MAX 500
int n, m;
int map[MAX + 1][MAX + 1];
int dx[19][4] = {
{0,0,0,0},{0,1,2,3},
{0,0,1,1},
{0,1,2,2}, {0,0,0,1}, {0,0,1,2},{0,0,0,-1}, {0,1,2,2}, {0,0,1,2},{0,1,1,1},{0,0,0,1},
{0,0,0,1},{0,1,1,1},{0,1,1,2},{0,1,1,2},
{0,1,1,2},{0,0,1,1},{0,0,1,1},{0,1,1,2}
};
int dy[19][4] = {
{0,1,2,3},{0,0,0,0},
{0,1,0,1},
{0,0,0,1},{0,1,2,0},{0,1,1,1},{0,1,2,2},{0,0,0,-1},{0,1,0,0},{0,0,1,2},{0,1,2,2},
{0,1,2,1},{0,-1,0,1},{0,-1,0,0},{0,0,1,0},
{0,0,1,1},{0,1,-1,0},{0,1,1,2},{0,-1,0,-1}
};
int main(void) {
scanf("%d%d", &n, &m);
for (int i= 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &map[i][j]);
}
}
int ans = -1;
int nx = 0, ny = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
for (int k = 0; k < 19; k++) {
int sum = 0;
for (int h = 0; h < 4; h++) {
nx = i + dx[k][h];
ny = j + dy[k][h];
if (nx < 0 || nx >= n) break;
if (ny < 0 || ny >= m) break;
sum += map[nx][ny];
if (h == 3) {
ans = ans < sum ? sum : ans;
}
}
}
}
}
printf("%d\n", ans);
return 0;
}