가장 아래 row 부터 시작하여
- 오른쪽 아래 대각선
- 오른쪽
- 오른쪽 위 대각선
순서로 탐색해야 최선의 결과이다.
다음 row 시작시 탐색할 수 있는 조건이 더 많아지기 때문이다.
isEmpty
에 빈 공간이면 true, 건물이면 false 입력 받음r
)만큼 r - 1
부터 for 문을 돌며 해당 row 인덱스, 0(col)으로 dfs()
시작한다.isEmpty
를 false로y
가 c - 1
이면 끝까지 파이프를 연결했으므로 answer
증가, return true
return true
return false
public class Main {
private static int r;
private static int c;
private static boolean[][] isEmpty;
private static int answer;
public static void main(String[] args) throws IOException {
// 초기화
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
String line;
st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
isEmpty = new boolean[r][c];
for (int i = 0; i < r; i++) {
line = br.readLine();
for (int j = 0; j < c; j++) {
isEmpty[i][j] = line.charAt(j) == '.';
}
}
// DFS
for (int i = r - 1; i >= 0; i--) {
int[] path = new int[c];
path[0] = i;
dfs(i, 0);
}
System.out.println(answer);
}
public static boolean dfs(int x, int y) {
isEmpty[x][y] = false;
if (y == c - 1) {
answer++;
return true;
}
// 오른쪽 아래 대각선
int ny = y + 1;
int nx = x + 1;
if (!isOOB(nx, ny) && isEmpty[nx][ny]) {
if (dfs(nx, ny)) {
return true;
}
}
// 오른쪽
nx = x;
if (!isOOB(nx, ny) && isEmpty[nx][ny]) {
if (dfs(nx, ny)) {
return true;
}
}
// 오른쪽 위 대각선
nx = x - 1;
if (!isOOB(nx, ny) && isEmpty[nx][ny]) {
if (dfs(nx, ny)) {
return true;
}
}
return false;
}
public static boolean isOOB(int x, int y) {
if (x < 0 || x >= r || y < 0 || y >= c) {
return true;
}
return false;
}
}