어흥

[백준 14500] 테트로미노 (C++) 본문

알고리즘/백준

[백준 14500] 테트로미노 (C++)

라이언납시오 2020. 3. 5. 15:18
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/14500

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변끼리 연결되어 있어야 한다. 즉, 꼭짓점과 꼭짓점만 맞닿아 있으면 안 된다. 정사각형 4개를 이어 붙인 폴리오미노는 테트로미노라고 하며, 다음과 같은 5가지가 있다. 아름이는 크기가 N×M인 종이 위에 테트로미노 하나를 놓으려고 한다. 종이는 1×1 크기의 칸으로 나누

www.acmicpc.net

1. 주의할 점

- 5가지 유형의 테트로미노 중 'ㅗ'모양을 제외하고는 DFS로 찾을 수 있다.

- 'ㅗ' 형태의 테트로미노에 대한 계산은 따로 구현한다

 

2. 구현

- cal 함수는 'ㅗ' 모양을 계산하기 위한 용도로 설계한다.

- (0,0)에서 (N,M)까지 전부 dfs와 cal 함수를 실행하고, 그 중 최대값을 출력한다.

#include <iostream>
#include <algorithm>
using namespace std;
int row, col, result = 0;
int arr[500][500];
bool check[500][500] = { false, };
int dx[4] = { 0,1,0,-1 };
int dy[4] = { -1,0,1,0 };

void dfs(int y, int x, int cnt, int sum) {
	if (cnt == 4) {
		result = max(result, sum);
		return;
	}
	for (int i = 0; i < 4; i++) {
		int nx = x + dx[i];
		int ny = y + dy[i];
		if (nx >= 0 && ny >= 0 && nx < col && ny < row && !check[ny][nx]) {
			check[ny][nx] = true;
			dfs(ny, nx, cnt + 1, arr[ny][nx] + sum);
			check[ny][nx] = false;
		}
	}
}

void cal(int y, int x) {
	int tt;
	if (y - 1 >= 0 && y + 1 < row) {
		if (x + 1 < col) {
			tt = arr[y][x] + arr[y - 1][x] + arr[y + 1][x] + arr[y][x + 1];
			result = max(result, tt);
		}
		if (x - 1 >= 0) {
			tt = arr[y][x] + arr[y - 1][x] + arr[y + 1][x] + arr[y][x - 1];
			result = max(result, tt);
		}
	}
	if (x - 1 >= 0 && x + 1 < col) {
		if (y + 1 < row) {
			tt = arr[y][x] + arr[y + 1][x] + arr[y][x - 1] + arr[y][x + 1];
			result = max(result, tt);
		}
		if (y - 1 >= 0) {
			tt = arr[y][x] + arr[y - 1][x] + arr[y][x - 1] + arr[y][x + 1];
			result = max(result, tt);
		}
	}
}

int main() {
	cin >> row >> col;
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			cin >> arr[i][j];
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			check[i][j] = true;
			dfs(i, j, 1, arr[i][j]);
			cal(i, j);
			check[i][j] = false;
		}
	}
	cout << result;
	system("pause");
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 10711] 모래성 (C++)  (0) 2020.03.05
[백준 12100] 2048 (Easy) (C++)  (0) 2020.03.05
[백준 16953] A → B (C++)  (0) 2020.03.04
[백준 2056] 작업 (C++)  (0) 2020.03.04
[백준 2186] 문자판 (C++)  (0) 2020.03.04
Comments