반응형

 

[광고 누르면 오늘의 행운 상승!!]

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

 

16988번: Baaaaaaaaaduk2 (Easy)

서기 2116년, 인간은 더 이상 AI의 상대가 되지 못하게 되었다. 근력, 순발력, 창의력, 사고력, 문제해결능력, 심지어 인간미조차 AI가 인간을 앞선다. AI가 온 지구를 관리하며 이미 인류는 지구의 주인 자리에서 쫓겨난지 오래이다. 그나마 다행인 것은 AI가 인간을 적대적으로 대하지 않고, 도리어 AI가 쌓아올린 눈부신 기술의 발전으로 모든 사람이 무제한적인 재화를 사용할 수 있게 되어 한 세기 전의 사람들이 바라던 돈 많은 백수와 같은 삶을 누릴

www.acmicpc.net

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));
						}
					}
				}
			}
		}
		
	}
}
반응형

+ Recent posts