https://www.acmicpc.net/problem/18428
18428번: 감시 피하기
NxN 크기의 복도가 있다. 복도는 1x1 크기의 칸으로 나누어지며, 특정한 위치에는 선생님, 학생, 혹은 장애물이 위치할 수 있다. 현재 몇 명의 학생들은 수업시간에 몰래 복도로 빠져나왔는데, 복
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
class Main{
static int N;
static char[][] map;
static int[][] dir = {{-1,0},{0,-1},{1,0},{0,1}};
static ArrayList<Pair> list = new ArrayList();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
map = new char[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine()," ");
for (int j = 0; j < N; j++) {
map[i][j] = st.nextToken().charAt(0);
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(map[i][j] == 'S') {
list.add(new Pair(i,j));
}
}
}
dfs(0);
System.out.println("NO");
}
public static void dfs(int wall) {
if(wall==3) {
bfs();
return;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(map[i][j] == 'X') {
map[i][j] = 'O';
dfs(wall+1);
map[i][j] = 'X';
}
}
}
}
public static void bfs() {
Queue<Pair> queue = new LinkedList();
char[][] map_copy = new char[N][N];
boolean[][] visited = new boolean[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
map_copy[i][j] = map[i][j];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(map_copy[i][j] == 'T') {
queue.add(new Pair(i,j));
visited[i][j] = true;
}
}
}
while(!queue.isEmpty()) {
Pair p = queue.poll();
for (int k = 0; k < 4; k++) {
int nx = dir[k][0] + p.x;
int ny = dir[k][1] + p.y;
while(isInside(nx,ny)) {
if(map_copy[nx][ny] != 'O') {
visited[nx][ny] = true;
nx = nx+dir[k][0];
ny = ny+dir[k][1];
}else break;
}
}
}
if(cath(visited)) {
System.out.println("YES");
System.exit(0);
}
}
public static boolean cath(boolean[][] visited) {
for(Pair p : list) {
if(visited[p.x][p.y] == true) return false;
}
return true;
}
public static boolean isInside(int x, int y) {
return x>=0 && y>=0 && x<N && y<N;
}
}
class Pair{
int x, y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
}
'ALGORITHM > 프로그래머스 | 백준 | 삼성 | 카카오' 카테고리의 다른 글
[백준] 2606번 바이러스 java (0) | 2022.12.12 |
---|---|
[백준] 13904 과제 java (0) | 2022.10.05 |
[백준] 마법사 상어와 비바라기 java 21610번 (0) | 2022.04.05 |
[백준] 2003 수들의 합2 java (0) | 2021.06.28 |
[백준] 구간 합 구하기 4 java (0) | 2021.06.28 |