https://www.acmicpc.net/problem/17069
간단한 DP 문제이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | //1-indexed #include<iostream> using namespace std; typedef long long ll; ll m[33][33], d[33][33][3]; int main(void) { int n; cin >> n; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) cin >> m[i][j]; d[1][2][0] = 1; //초기에는 1,2로 가로로 들어가는 방법 한가지 d[1][2][1] = 0; d[1][2][2] = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (i == 1 && j <= 2) continue; if (m[i][j] == 1) //현재 지점이 벽이면, 그 지점까지 오는 경로는 모두0 (그냥 스킵해도 초기화 0으로 되어있음) continue; if (m[i][j - 1] == 1) d[i][j][0] = 0; //가로로 들어오는 방법이 없는 경우 = 그 바로 왼쪽 벽인 경우 else d[i][j][0] = d[i][j - 1][0] + d[i][j - 1][2]; if (m[i - 1][j] == 1) d[i][j][1] = 0; //세로로 들어오는 방법이 없는 경우 = 그 바로 위쪽이 벽인 경우 else d[i][j][1] = d[i - 1][j][1] + d[i - 1][j][2]; if (m[i - 1][j] == 1 || m[i][j - 1] == 1) d[i][j][2] = 0; //대각으로 오는 방법이 없는 경우 = 날개 둘 중 하나라도 벽인 경우 else d[i][j][2] = d[i - 1][j - 1][0] + d[i - 1][j - 1][1] + d[i - 1][j - 1][2]; } } cout << d[n][n][0] + d[n][n][1] + d[n][n][2]; //모든 방향으로 들어오는 경우의 합 return 0; } | cs |
'알고리즘 문제 풀이 > 백준 온라인 저지' 카테고리의 다른 글
백준 2210번: 숫자판 점프 (C++) (0) | 2019.08.09 |
---|---|
백준 2589번: 보물섬 (C++) (0) | 2019.08.09 |
백준 17070번: 파이프 옮기기 1 (C++) (0) | 2019.08.09 |
백준 14890번: 경사로 (C++) (0) | 2019.08.09 |
백준 14889번: 스타트와 링크 (C++) (0) | 2019.08.07 |