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

jw·2022년 12월 20일
0

백준

목록 보기
97/141
post-thumbnail

문제

길이 2의 파이프의 한 쪽 끝을 (N,N)으로 옮기는 문제다.
파이프 초기 위치는 (1,1) (1,2)이며
가로, 대각선, 세로 방향으로 밀어서 옮긴다.

풀이

  1. 파이프의 좌표와 현재 진행 방향을 인자로 가진 함수를 사용했다.
    void go(y, x, 현재 진행방향)
  2. y,x가 n을 넘어가거나 파이프가 놓일 좌표에 벽이 있으면 return한다.
  3. 진행방향이 대각선일 때는 파이프가 놓일 좌표의 왼쪽과 위쪽도 벽이 없어야 한다.
  4. 각 진행 방향 마다 갈 수 있는 방향에 따라 재귀 함수 호출한다.

코드

#include <iostream>
#include <algorithm>
using namespace std;
int n, cnt, a[17][17], dir[3][2] = {{0, 1}, {1, 0}, {1, 1}};
void go(int y, int x, int cur)
{
    if (y >= n || x >= n || a[y][x] == 1)
        return;
    if (cur == 2)
    {
        if (a[y - 1][x] == 1 || a[y][x - 1] == 1)
            return;
    }
    if (y == n - 1 && x == n - 1)
    {
        cnt++;
        return;
    }
    if (cur == 0)
    {
        go(y + dir[0][0], x + dir[0][1], 0);
        go(y + dir[2][0], x + dir[2][1], 2);
    }
    else if (cur == 1)
    {
        go(y + dir[1][0], x + dir[1][1], 1);
        go(y + dir[2][0], x + dir[2][1], 2);
    }
    else if (cur == 2)
    {
        go(y + dir[0][0], x + dir[0][1], 0);
        go(y + dir[1][0], x + dir[1][1], 1);
        go(y + dir[2][0], x + dir[2][1], 2);
    }
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            cin >> a[i][j];

    go(0, 1, 0);
    cout << cnt << "\n";
}
profile
다시태어나고싶어요

0개의 댓글