17070번
문제
문제 해결 순서
- 맨 처음 입력받은 숫자로 2차원 배열 arr을 초기화 (파이프 끝 부분만 생각하면 된다는 점이 포인트)
- 재귀함수
search()
를 만들어 각각의 조건에 맞으면 다시 search()
를 호출 isEscape()
함수를 통해 좌표값이 배열을 벗어나는지
import java.util.Scanner;
class Main {
public static int answer;
public static int n;
public static int arr[][];
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
answer = 0;
n = scan.nextInt();
arr = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = scan.nextInt();
}
}
search(0, 1, 0);
System.out.print(answer);
}
public static void search(int i, int j, int d) {
if (i == n - 1 && j == n - 1) {
answer++;
return;
}
if(d == 0){
if (isEscape(i, j + 1) && arr[i][j + 1] == 0) {
search(i, j + 1, 0);
}
if (isEscape(i + 1, j + 1) && arr[i][j + 1] == 0 && arr[i + 1][j] == 0 && arr[i + 1][j + 1] == 0) {
search(i + 1, j + 1, 2);
}
}
else if(d == 1){
if (isEscape(i + 1, j) && arr[i + 1][j] == 0) {
search(i + 1, j, 1);
}
if (isEscape(i + 1, j + 1) && arr[i][j + 1] == 0 && arr[i + 1][j] == 0 && arr[i + 1][j + 1] == 0) {
search(i + 1, j + 1, 2);
}
}
else if(d == 2){
if (isEscape(i + 1, j) && arr[i + 1][j] == 0) {
search(i + 1, j, 1);
}
if (isEscape(i + 1, j + 1) && arr[i][j + 1] == 0 && arr[i + 1][j] == 0 && arr[i + 1][j + 1] == 0) {
search(i + 1, j + 1, 2);
}
if (isEscape(i, j + 1) && arr[i][j + 1] == 0) {
search(i, j + 1, 0);
}
}
}
public static boolean isEscape(int i, int j) {
if(i >= 0 && i < n && j >= 0 && j < n){
return true;
}
return false;
}
}