in.add()
[14500] 테트로미노 본문
문제 링크 : https://www.acmicpc.net/problem/14500
14500번: 테트로미노
폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변
www.acmicpc.net
문제 해결 방법
"ㅗ" 모양을 제외하고는 map 배열의 칸마다 dfs로 depth 4만큼 갔을 때의 경우를 검사하면 된다.
dfs를 타고 들어갔을때 다른 모양은 존재하지 않음!
"ㅗ" 모양은 checkT 함수에서 + 모양의 가운데를 중심으로 "ㅏ", "ㅜ", "ㅓ", "ㅗ" 순서대로 더해봐서 최댓값을 구한다.
import java.util.Scanner;
public class Main {
static int N, M, answer;
static int[][] map;
static int[] dr = {-1, 0, 1, 0};
static int[] dc = {0, 1, 0, -1};
static boolean[][] visit;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
map = new int[N][M];
answer = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
map[i][j] = sc.nextInt();
}
}
visit = new boolean[N][M];
for (int i = 0; i < N ; i++) {
for (int j = 0; j < M; j++) {
visit[i][j] = true;
dfs(i, j, 1, map[i][j]);
checkT(i, j);
visit[i][j] = false;
}
}
System.out.println(answer);
}
static void dfs(int r, int c, int cnt, int sum) {
if (cnt == 4) {
answer = Math.max(answer, sum);
return;
}
for (int i = 0; i < 4; i++) {
int nextR = r + dr[i];
int nextC = c + dc[i];
if (nextR >= 0 && nextC >= 0 && nextR < N && nextC < M && !visit[nextR][nextC]) {
visit[nextR][nextC] = true;
dfs(nextR, nextC, cnt + 1, sum + map[nextR][nextC]);
visit[nextR][nextC] = false;
}
}
}
static void checkT(int r, int c) {
for(int i = 0; i < 4; i++) {
int sum = map[r][c];
boolean flag = false;
for (int j = 0; j < 3; j++) {
int nextR = r + dr[(i + j) % 4];
int nextC = c + dc[(i + j) % 4];
if (nextR >= 0 && nextC >= 0 && nextR < N && nextC < M) {
sum += map[nextR][nextC];
} else {
flag = true;
break;
}
}
if(!flag) answer = Math.max(answer, sum);
}
}
}
'Algorithm > BOJ' 카테고리의 다른 글
[16234] 인구 이동 (0) | 2021.11.05 |
---|---|
[1647] 도시 분할 계획 (0) | 2021.11.02 |
[14503] 로봇 청소기 (0) | 2021.10.20 |
[2293] 동전 1 (0) | 2021.10.19 |
[14442] 벽 부수고 이동하기 2 (0) | 2021.10.17 |
Comments