본문 바로가기

PS/백준

[백준 17070번] 파이프 옮기기 1 C++

728x90

https://www.acmicpc.net/problem/17070

 

17070번: 파이프 옮기기 1

유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의

www.acmicpc.net

 

간단하게 가로일떄 세로일때 대각선일때 어떻게 파이프를 움직여나갈건지

DFS로 탐색하며 

마지막칸에 도달시 카운트를 한개씩 올려줬다.

 

 

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
44
45
46
#include <iostream>
#include <cstring>
#include <algorithm>
 
using namespace std;
 
int n;
int cnt = 0;
 
int arr[17][17];
bool visit[17][17];
//state 가 0이면 가로상태, 1이면 세로상태, 2면 대각선상태를 나타냄
int dfs(int a, int b, int state) {
    if (a >= n || b >= n || arr[a][b] == 1return 0;
    if (state == 2 && (arr[a][b] == 1 || arr[a - 1][b] == 1 || arr[a][b - 1== 1)) return 0;
 
    if (a == n - 1 && b == n - 1) {
        cnt++;
        return 0;
    }    
    if (state == 0) {
        dfs(a, b + 10);
        dfs(a + 1, b + 12);
 
    }
    else if (state == 1) {
        dfs(a + 1, b, 1);
        dfs(a + 1, b + 12);
    }
    else {
        dfs(a + 1, b, 1);
        dfs(a, b + 10);
        dfs(a + 1, b + 12);
    }
 
    return 0;
}
int main() {
    cin >> n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            cin >> arr[i][j];
    dfs(010);
    cout << cnt;
    return 0;
}
cs
728x90

'PS > 백준' 카테고리의 다른 글

[백준 17471번] 게리맨더링 C++  (0) 2021.05.16
[백준 17281번] ⚾(야구) C++  (1) 2021.05.16
[백준 2156번] 포도주 시식 c++  (0) 2021.05.13
[백준 10844번] 쉬운 계단 수 C++  (0) 2021.05.13
[백준 2579번] 계단 오르기 C++  (0) 2021.05.12