Skip to content

Instantly share code, notes, and snippets.

@niklasjang
Created August 18, 2020 02:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save niklasjang/9aedc536c06ed257dabb8559c3a59317 to your computer and use it in GitHub Desktop.
Save niklasjang/9aedc536c06ed257dabb8559c3a59317 to your computer and use it in GitHub Desktop.
[PS][java][완전탐색][BFS]/[탈출]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int r,c;
static int[][] map;
static boolean[][] visit;
static Queue<Point> water, kak;
static Point start,dest;
static class Point{
int r,c;
Point(int r, int c){
this.r = r;
this.c = c;
}
}
static int[] dx = {0,0,1,-1};
static int[] dy = {1,-1,0,0};
static void waterMove(){
int size = water.size();
for(int i=0; i< size; i++){
Point curr = water.poll();
for(int k=0; k<4; k++){
int nx = curr.r + dx[k];
int ny = curr.c + dy[k];
if(nx<0 || r<= nx || ny <0 || c<=ny) continue;
if(visit[nx][ny]) continue;
if(nx==dest.r && ny ==dest.c) continue;
if(map[nx][ny] == -1) continue;
map[nx][ny] = -1;
water.offer(new Point(nx,ny));
}
}
}
static void bfs(Point start){
visit[start.r][start.c] = true;
kak.offer(start);
while(!kak.isEmpty()){
waterMove();
int size = kak.size();
for(int i=0; i<size; i++){
Point curr = kak.poll();
for(int k=0; k<4; k++){
int nx = curr.r + dx[k];
int ny = curr.c + dy[k];
if(nx<0 || r<= nx || ny <0 || c<=ny) continue;
if(visit[nx][ny]) continue;
if(map[nx][ny]==-1) continue;
visit[nx][ny] = true;
map[nx][ny] = map[curr.r][curr.c] + 1;
kak.offer(new Point(nx,ny));
if(nx==dest.r && ny ==dest.c) break;
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] rc = br.readLine().split(" ");
r = Integer.parseInt(rc[0]);
c = Integer.parseInt(rc[1]);
map = new int[r][c];
visit = new boolean[r][c];
water = new LinkedList<>();
kak = new LinkedList<>();
for(int i=0; i< r; i++){
String line = br.readLine();
for(int j=0; j<c; j++){
switch(line.charAt(j)){
case '.':
map[i][j] = 0;
break;
case '*':
map[i][j] = -1;
water.offer(new Point(i,j));
break;
case 'S':
start = new Point(i,j);
break;
case 'D':
dest = new Point(i,j);
break;
case 'X':
map[i][j] = -1;
break;
default :
System.out.println("default");
}
}
}
bfs(start);
if(map[dest.r][dest.c] != 0){
System.out.println(map[dest.r][dest.c]);
}else{
System.out.println("KAKTUS");
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment