알고리즘
백준 10164번 격자상의 경로 (JAVA)
박카스마시며코딩
2021. 12. 8. 16:52
https://www.acmicpc.net/problem/10164
10164번: 격자상의 경로
입력의 첫째 줄에는 격자의 행의 수와 열의 수를 나타내는 두 정수 N과 M(1 ≤ N, M ≤ 15), 그리고 ○로 표시된 칸의 번호를 나타내는 정수 K(K=0 또는 1 < K < N×M)가 차례로 주어지며, 각 값은 공백으
www.acmicpc.net
저는 중복제거를 위해 DP를 이용해 접근하였습니다.
또한 입력의 세번째 인자 값을 확인하여 배열에 순차적으로 넣지 않고 수학적으로 접근하여 행과 열을 구하였습니다.
package BOJ;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_10164 {
static int n,m;
static int dp[][];
static int py =0,px =0;
static int dy[] = {0,1};
static int dx[] = {1,0};
static int dfs(int sy, int sx ,int ey, int ex){
if(sy == ey && sx == ex){
return 1;
}
if(dp[sy][sx] != 0){
return dp[sy][sx];
}else{
int result = 0;
for(int i = 0 ; i < 2; i++){
int ny = sy + dy[i];
int nx = sx + dx[i];
if(nx >= 0 && nx < m && ny >= 0 && ny < n){
result += dfs(ny,nx,ey,ex);
}
}
return result;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
Function<String,Integer> stoi = Integer::parseInt;
n = stoi.apply(st.nextToken());
m = stoi.apply(st.nextToken());
dp = new int[n][m];
int num = stoi.apply(st.nextToken());
if(num != 0){
py = (num - 1) / m;
px = (num - 1) % m;
// System.out.println(py +" "+px);
}
// System.out.println(dfs(0,0,py,px));
// System.out.println(dfs(py,px,n-1,m-1));
System.out.println(dfs(0,0,py,px) * dfs(py,px,n-1,m-1));
}
}