강산이는 심각한 게임 중독자이기 때문에 날씨에 상관없이 매일 PC방을 간다.
최근에 폭우로 인해 일부 지역이 침수되어 침수된 지역으로는 이동할 수 없게 되었다. 하지만 강산이는 출석 이벤트를 위해 하루도 빠짐없이 PC방을 가야 한다.
강산이는 PC방까지 상, 하, 좌, 우 방향으로만 이동하며, 한 번 이동할 때의 거리는 1이다. 또한, 강산이는 게임을 빨리하러 가야 하기 때문에 집에서 PC방까지 최단경로로 움직인다.
강산이의 집의 좌표 (H, H)와 PC방의 좌표 (N, N)이 주어지고 좌표평면 위 (x, y)에서 y > x인 곳은 침수되었다고 할 때, 강산이가 침수된 지역을 피해서 PC방까지 갈 수 있는 경로의 개수를 구하라.
단, PC방의 좌표가 집의 좌표 같은 경우 경로는 1가지라고 한다.
입력
첫째 줄에 집과 PC방의 좌표 (H, H), (N, N) 을 나타내는 두 정수 H, N (0 ≤ H, N ≤ 30) 이 차례로 주어진다.
출력
집에서 PC방까지 갈 수 있는 경로의 개수를 출력한다.
예제 입력 1
8 4 |
예제 출력 1
14 |
예제 입력 2
0 3 |
예제 출력 2
5 |
더보기
Solution
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int H, N;
long **board=NULL;
scanf("%d%d", &H, &N);
if(H==N)
{
printf("1\n");
return 0;
}
if(H>N)
{
H+=N;
N=H-N;
H-=N;
}
N-=H;
H=0;
board=(long **)malloc((N+2)*sizeof(long *));
for(int n=0;n<N+2;n++)
board[n]=(long *)calloc(N+2,sizeof(long));
for(int i=1;i<N+2;i++)
{
board[0][i]=1;
for(int j=1;j<=i;j++)
board[i][j]=board[i-1][j]+board[i][j-1];
}
printf("%ld\n", board[N+1][N+1]);
for(int n=0;n<N+2;n++)
free(board[n]);
free(board);
return 0;
}
728x90
'백준 알고리즘' 카테고리의 다른 글
<백준 알고리즘> 2096번: 내려가기 (0) | 2023.02.06 |
---|---|
<백준 알고리즘> 1459번: 걷기 (0) | 2023.02.06 |
<백준 알고리즘> 1748번: 수 이어쓰기 1 (0) | 2023.02.06 |
<백준 알고리즘> 18883번: N M 찍기 (1) | 2023.02.06 |
<백준 알고리즘> 1182번: 부분수열의 합 (0) | 2023.02.06 |