반응형
[광고 누르면 오늘의 행운 상승!!]
https://www.acmicpc.net/problem/16988
DFS 순열 문제
1. 주의사항.
- DFS로 count를 구할 때 전역에서 구해서 전체 크기를 알아내었다.
- 상대돌 근처의 인근노드만 검사하여 시간을 줄였다.
2. 풀이
- 상대돌 근처의 인근노드를 리스트에 넣는다.
- 리스트의 순열을 뽑아내어 cnt가 2가 되면 맵을 체크한다.
- 체크한 맵의 돌이 2면 dfs를 시작하여 그룹의 사이즈를 구한다.
- 체크한 그룹이 잡아먹히는 구조(0을 만나지 않았다면)라면 ans에 더한다.
- 체크한 그룹이 잡아먹히는 구조가 아니라면(0을 만났다면)라면 더하지 않는다.
- 최종 ans를 출력한다.
package Study5;
import java.io.*;
import java.util.*;
class rock{
int row, col;
public rock(int row , int col) {
this.row = row;
this.col = col;
}
}
public class 바둑 {
static final int[] dx = {-1,0,1,0};
static final int[] dy = {0,1,0,-1};
static int[][] map;
static boolean[] v;
static boolean[][] visit;
static int N,M,count,ans;
static List<rock> list = new ArrayList<>();
static boolean flag = false;
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("test.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new int[N][M];
visit = new boolean[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
makePlace();
v = new boolean[list.size()];
dfs(0);
System.out.println(ans);
}
private static void dfs(int cnt) {
if (cnt == 2) {
int temp = 0;
count = 0;
visit = new boolean[N][M];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (map[i][j] == 2 && !visit[i][j]) {
flag = false;
checkMap(i, j);
if (!flag) temp += count;
count = 0;
}
}
}
ans = Math.max(temp, ans);
return;
}
for (int i = 0; i < list.size(); i++) {
if(!v[i]) {
v[i] = true;
map[list.get(i).row][list.get(i).col] = 1;
dfs(cnt+1);
map[list.get(i).row][list.get(i).col] = 0;
v[i] = false;
}
}
}
private static void checkMap(int row, int col) {
count++;
visit[row][col] = true;
for (int i = 0; i < 4; i++) {
int nx = row + dx[i];
int ny = col + dy[i];
if (nx < 0 || nx >= N || ny < 0 || ny >= M)
continue;
if(map[nx][ny] == 0) flag = true;
if(map[nx][ny] == 2 && !visit[nx][ny]) {
checkMap(nx,ny);
}
}
}
private static void makePlace() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (map[i][j] == 2) {
for (int dir = 0; dir < 4; dir++) {
int nx = i + dx[dir];
int ny = j + dy[dir];
if (nx < 0 || nx >= N || ny < 0 || ny >= M)
continue;
if(map[nx][ny] == 0 && !visit[nx][ny]) {
visit[nx][ny] = true;
list.add(new rock(nx,ny));
}
}
}
}
}
}
}
반응형
'2. 알고리즘사이트 > 1. 백준' 카테고리의 다른 글
치킨배달 [백준 15686][JAVA][골드 5][조합] (0) | 2020.05.02 |
---|---|
화물차 [백준 1400][JAVA][골드 3][BFS] (0) | 2020.05.01 |
비숍 [백준 1799][JAVA][골드2][백트래킹] (0) | 2020.04.27 |
도시분할계획 [백준 1647][JAVA][골드 4][프림][크루스칼][MST] (0) | 2020.04.27 |
말이 되고픈 원숭이 [백준 1600][JAVA][골드 5][BFS] (0) | 2020.04.27 |