14500 테트로미노
본문 바로가기
알고리즘 모음집/New 알고리즘

14500 테트로미노

by KyeongMin 2021. 3. 16.
728x90
반응형

www.acmicpc.net/problem/14500

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변

www.acmicpc.net

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#define NS 502//최대 배열 사이즈
int N, M;// 입력으로 주어지는 것
int arr[NS][NS];//입력으로 주어지는 배열
int ret;//결과값 저장
int D[NS][NS];//블럭 저장
int dy[] = { 0,1,0,-1 };
int dx[] = { 1,0,-1,0 };
//1, ㅏ ㅗ ㅓ ㅜ 구현
int A[4][3][3] = {
	{
		{1,0,0},
		{1,1,0},
		{1,0,0}
	},
	{
		{0,1,0},
		{1,1,1},
		{0,0,0}
	},
	{
		{1,1,1},
		{0,1,0},
		{0,0,0}
	},
	{
		{0,1,0},
		{1,1,0},
		{0,1,0}
	},
};
bool safe(int y, int x) {//범위 체크
	return 0 <= y && y < N && 0 <= x && x < M;
}
//2. dfs로 나머지 블럭 구현
void dfs(int y, int x, int cnt,long long int sum) {
	if (cnt == 3) {
		ret = ret < sum ? sum : ret;//최대값
		return;
	}
	for (int dir = 0; dir < 4; dir++) {
		int ny = y + dy[dir]; int nx = x + dx[dir];
		if (safe(ny,nx)&&D[ny][nx] == 0) {
			D[ny][nx] = 1;
			dfs(ny, nx, cnt + 1,sum+arr[ny][nx]);
			D[ny][nx] = 0;
		}
	}
}
//3. ㅏ ㅗ ㅓ ㅜ 탐색
void serachA() {//전체 탐색
	for (int a = 0; a < 4; a++) {

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				long long int sum = 0;//합 계산
				for (int aY = 0; aY < 3; aY++) {
					for (int aX = 0; aX < 3; aX++) {
						int ny = i + aY; int nx = j + aX;
						if (A[a][aY][aX] == 1) {
							sum += arr[ny][nx];
						}
					}//for int aX
				}//for int aY
				ret = ret < sum ? sum : ret;//최대값
			}//for int j
		}//for int i

	}
}
void init() {//초기화 및 초기 입력
	N = M = 0;
	ret = 0x80000000;
	memset(arr, 0x80, sizeof(arr));//초기화
	scanf("%d %d", &N, &M);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf("%d", &arr[i][j]);
		}
	}
}
int main(void) {
	int testCase = 1;//테스트 케이스
	//scanf("%d", &testCase);
	for (int tc = 1; tc <= testCase; tc++) {
		init();
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; +j++) {
				D[i][j] = 1;
				dfs(i, j, 0, arr[i][j]);
				D[i][j] = 0;
			}
		}
		serachA();
		//printf("#%d %d\n", tc, ret);
		printf("%d\n", ret);
	}
	return 0;
}

728x90
반응형

'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글

14502 연구소(리팩토링)  (0) 2021.03.19
15686 치킨 배달  (0) 2021.03.16
14503 로봇 청소기  (0) 2021.03.15
14499 주사위 굴리기  (0) 2021.03.15
2607 비슷한 단어  (0) 2021.03.08

댓글