JongSeok_12 2020. 7. 15. 19:05

https://www.acmicpc.net/problem/14500

 

14500번: 테트로미노

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

www.acmicpc.net

풀이

DFS를 사용하여 풀이하면 되는 문제이다.

1. 최대 입력값은 500이기 때문에 배열의 크기는 500으로 할당

2. ㅗ 도형을 제외한 나머지 도형은 위, 아래, 우측, 좌측 으로 이동하며 DFS를 돌리면 도형이 나온다.

EX ) 우측, 우측, 우측, 우측 -> " ---- " 과 같이 예제에서 주어지는 도형 중 " ㅗ " 자 도형을 제외한 모든 경우의 수는 위, 아래, 왼쪽, 오른쪽 방향으로 움직이면서 경우의 수 탐색

3. 2번에서 ㅗ 도형을 제외한 모든 도형의 경우의 수에 알맞는 합을 구하여 max 값을 갱신했으니 나머지 ㅗ 도형에 대한 값을 구하면 된다. ㅗ 자 도형은 각 좌표를 설정하여 대칭, 회전 한 모든 경우의 수를 3차원 배열에 담아둔 뒤 DFS 수행

  + "ㅗ" 도형 좌표 구하는 방법

#include <iostream>
#include <cstring>
#include <vector>

using namespace std;
int map[500][500];
int visit[500][500];
int my, mx;
int maxx = 0;

// ㅗ 자 모양
int dcheck[4][4][2] = {
	{
		0,0,
		1,0,
		1,-1,
		1,1
	}, 
	{
		0,0,
		0,1,
		0,2,
		1,1
	},
	{
		0,0,
		1,0,
		1,-1,
		2,0
	},
	{
		0,0,
		1,0,
		2,0,
		1,1,
	}
};

// 상하좌우
int check[5][2] = {
	0,0,
	1, 0,
	-1, 0,
	0, 1,
	0, -1
};

// ㅗ 모형을 제외한 모형의 모든 경우의 수 탐색
void dfs_b(int level, int y, int x, int sum){
	if (level == 4){
		if (sum > maxx) maxx = sum;
		return;
	}
	for (int i = 0; i < 5; ++i){
		int dy = y + check[i][0];
		int dx = x + check[i][1];
		if (dy >= 0 && dx >= 0 && dy < my && dx < mx && visit[dy][dx] == 0){
			visit[dy][dx] = 1;
			dfs_b(level + 1, dy, dx, sum + map[dy][dx]);
			visit[dy][dx] = 0;
		}
	}
}

// ㅗ 모형에 대한 경우의 수 탐색
void dfs_a(int level, int y, int x, int sum, int idx){
	if (level == 4){
		if (sum > maxx) maxx = sum;
		return;
	}

	for (int i = 0; i < 4; ++i){
		int dy = y + dcheck[idx][i][0];
		int dx = x + dcheck[idx][i][1];
		if (dy >= 0 && dx >= 0 && dy < my && dx < mx && visit[dy][dx] == 0){
			visit[dy][dx] = 1;
			dfs_a(level + 1, y, x, sum + map[dy][dx], idx);
			visit[dy][dx] = 0;
		}
	}
}

int main(){
	freopen_s(new FILE*, "tes.text", "r", stdin);
	cin >> my >> mx;
	for (int i = 0; i < my; ++i){
		for (int j = 0; j < mx; ++j){
			cin >> map[i][j];
		}
	}

	for (int i = 0; i < my; ++i){
		for (int j = 0; j < mx; ++j){
			dfs_b(0, i, j, 0);
			for (int idx = 0; idx < 4; ++idx){
				dfs_a(0, i, j, 0, idx);
			}
		}
	}


	printf("%d", maxx);
}