https://www.acmicpc.net/problem/17070
17070번: 파이프 옮기기 1
유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의
www.acmicpc.net
[난이도] Gold5
[유형] DP
[풀이]
DP[y][x][k] : 파이프의 끝 부분이 y,x에 있고, k번 방향으로 위치해 있을 때 (0: 가로, 1:세로, 2:대각선)
N-1,N-1까지 갈 수 있는 경우의 수.
#include <cstdio>
#include <cstring>
using namespace std;
int N,a[16][16],dp[16][16][3];
bool check(int y,int x){
return y>=0&&x>=0&&y<N&&x<N&&!a[y][x];
}
bool all(int y,int x){
return check(y,x+1) && check(y+1,x) && check(y+1,x+1);
}
int sol(int y,int x,int k){
if(y==N-1&&x==N-1) return 1;
int& ret = dp[y][x][k];
if(ret!=-1) return ret;
ret = 0;
if(k==0){
if(check(y,x+1)) ret+=sol(y,x+1,0);
}else if(k==1){
if(check(y+1,x)) ret+=sol(y+1,x,1);
}else{
if(check(y,x+1)) ret+=sol(y,x+1,0);
if(check(y+1,x)) ret+=sol(y+1,x,1);
}
if(all(y,x)) ret+=sol(y+1,x+1,2);
return ret;
}
int main(){
scanf("%d",&N);
for(int i=0;i<N;i++)
for(int j=0;j<N;j++) scanf("%d",&a[i][j]);
memset(dp,-1,sizeof(dp));
printf("%d",sol(0,1,0));
}
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold5/17070.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold5] 2636 : 치즈 (C++) (0) | 2021.03.25 |
---|---|
[BOJ/백준][Gold5] 13549 : 숨바꼭질 3 (C++) (0) | 2021.03.25 |
[BOJ/백준][Gold4] 1963 : 소수 경로 (C++) (0) | 2021.03.25 |
[BOJ/백준][Gold5] 2493 : 탑 (C++) (0) | 2021.03.25 |
[BOJ/백준][Gold5] 1092 : 배 (C++) (0) | 2021.03.25 |