티스토리 뷰

 

dp로 쉽게 풀 수 있는 문제다

물론 틀렸음~~~!

 

조건에 맞게 d[x][y][k]로 (x,y)에서 k로 놓는 방법의 수라고 생각해보자

0은 가로 / 1은 대각선 / 2 는 세로다

 

그럼 내가 가로로 놓기 위해서는 

- 현재칸이 0이여야하고

- 다음 칸이 비어있어야하고

- 이전에 가로 or 대각 으로 놓았을 때만 가로로 놓기 가능

 

따라서 다음 칸이 비어있다면

d[x][y][0] += (d[x][y-1][0] + d[x-1][y-1][1])이 완성된다!

 

이런 식으로 3방향을 다 보면 된다!

 

소스코드

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
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
int n;
ll d[33][33][3];
int map[33][33];
bool can(int x,int y){
    return (1<=&& x<=&& 1<=&& y<=&& !map[x][y]);
}
int main(){
    scanf(" %d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            scanf(" %d",&map[i][j]);
        }
    }
    d[1][1][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(map[i][j]) continue;
            int nx = i+1;
            int ny = j+1;
            if(can(i,ny)) d[i][j][0+=(d[i][j-1][0]+d[i-1][j-1][1]);
            if(can(nx,j)) d[i][j][2+=(d[i-1][j][2]+d[i-1][j-1][1]);
            if(can(nx,ny) && can(i,ny) &&can(nx,j)) d[i][j][1+=(d[i][j-1][0]+d[i-1][j][2]+d[i-1][j-1][1]);
        }
    }
    ll ans = d[n-1][n-1][1+ d[n-1][n][2+ d[n][n-1][0];
    printf("%lld\n",ans);
}
 
 

'알고리즘 > BOJ' 카테고리의 다른 글

[백준] 16986 인싸들의 가위바위보  (0) 2020.02.02
[백준] 1103 게임  (0) 2020.02.01
[백준] 17135 캐슬 디펜스  (0) 2020.02.01
[백준] 2526 싸이클  (0) 2020.01.31
[백준] 14868 문명  (0) 2020.01.30
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
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
글 보관함