알고리즘
[백준-그래프탐색-dfs] 1520 - 내리막길
제이G
2022. 7. 2. 11:38
코드
package dfs;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Pr1520내리막길_복습2 {
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, 1, 0, -1};
static int M;
static int N;
static int DP[][];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader (System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken()); //행
N = Integer.parseInt(st.nextToken()); //열
int[][] board = new int[M+1][N+1];
DP = new int[M+1][N+1];
for (int i=1; i<M+1; i++) {
st = new StringTokenizer(br.readLine());
for (int j=1; j<N+1; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
DP[i][j] = -1;
}
}
System.out.println(dfs(1,1, board));
}
static int dfs(int x, int y, int[][] board) {
//base case
if (x==M && y==N) {
return 1;
}
//recursive case
if(DP[x][y] == -1) {
DP[x][y] = 0; //x,y 방문
for (int i=0; i<4; i++) {
//탐색할 다음 x,y좌표
int nx = x + dx[i];
int ny = y + dy[i];
//탐색가능한지 검출
if (nx>=1 && nx<=M && ny>=1 && ny<=N) {
if (board[nx][ny] < board[x][y]) {
//다음 노드 탐색
DP[x][y] += dfs(nx, ny, board);
//그림을 그려보면 호출된놈의 리턴값은 호출한놈에 저장되는 것이 맞다.
}
}
}
}
return DP[x][y];
}
}