백준 18428 감시 피하기
업데이트:
감시 피하기
백트래킹 순열로 구현함
이코테에서 난의도가 별 3개 중에 2.5개 였는데 백트래킹만 알면 난의도는 확 낮아지는 것 같다.
import java.util.Scanner;
public class Main {
static int n;
static String[][] filed, obstacle;
static boolean[][] check;
static boolean result = false;
static int[] nx = {1,-1,0,0};
static int[] ny = {0,0,1,-1};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
filed = new String[n][n];
obstacle = new String[n][n];
check = new boolean[n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
String str = sc.next();
filed[i][j] = str;
}
sc.nextLine();
}
per(0);
if(result) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
private static void per(int cnt) {
if(cnt ==3) {
confirm();
return;
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
String str = filed[i][j];
if(str.equals("X") && !check[i][j]) {
check[i][j] = true;
filed[i][j] = "O";
per(cnt+1);
if(result) return;
filed[i][j] = "X";
check[i][j] = false;
}
}
}
}
private static void confirm() {
boolean confirmCheck = false;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
String teacher = filed[i][j];
if(teacher.equals("T")) {
for(int k = 0; k < 4; k++) {
confirmCheck = dfs(i+nx[k], j+ny[k], nx[k], ny[k]);
if(confirmCheck) return;
}
}
}
}
result = true;
}
private static boolean dfs(int i, int j, int x, int y) {
if(i >= 0 && j >= 0 && i < n && j < n) {
String str = filed[i][j];
if(str.equals("O")) {
return false;
} else if(str.equals("S")) {
return true;
} else {
return dfs(i+x, j+y, x, y);
}
}
return false;
}
}
댓글남기기