[14500] 테트로미노

1 minute read

풀이

모든 경우를 배열에 저장해주고 모두 확인하면 됩니다. 모든 가능한 테트로미노를 그리고 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;
}