[백준 c++] 1189 컴백홈

jw·2022년 10월 17일

백준

목록 보기
49/141
post-thumbnail

문제 설명

https://www.acmicpc.net/problem/1189
한수는 캠프를 마치고 집에 돌아가려 한다. 한수는 현재 왼쪽 아래점에 있고 집은 오른쪽 위에 있다. 그리고 한수는 집에 돌아가는 방법이 다양하다. 단, 한수는 똑똑하여 한번 지나친 곳을 다시 방문하지는 않는다.

  cdef  ...f  ..ef  ..gh  cdeh  cdej  ...f 
  bT..  .T.e  .Td.  .Tfe  bTfg  bTfi  .Tde 
  a...  abcd  abc.  abcd  a...  a.gh  abc. 

거리 : 6 6 6 8 8 10 6
위 예제는 한수가 집에 돌아갈 수 있는 모든 경우를 나타낸 것이다. T로 표시된 부분은 가지 못하는 부분이다. 문제는 R x C 맵에 못가는 부분이 주어지고 거리 K가 주어지면 한수가 집까지도 도착하는 경우 중 거리가 K인 가짓수를 구하는 것이다.

입력
첫 줄에 정수 R(1 ≤ R ≤ 5), C(1 ≤ C ≤ 5), K(1 ≤ K ≤ R×C)가 공백으로 구분되어 주어진다. 두 번째부터 R+1번째 줄까지는 R×C 맵의 정보를 나타내는 '.'과 'T'로 구성된 길이가 C인 문자열이 주어진다.

출력
첫 줄에 거리가 K인 가짓수를 출력한다.

아이디어

최단경로를 구하는 것이 아니라 모든 경로를 구하는 것이므로 dfs로 풀었다.
visited가 0이고 T가 아니면 go(cnt+1,nt,nx) 그리고 visited를 다시 0으로 바꿔준다.
만약 도착지점인 (0,m-1)에 도달하면 해당 cnt를 인덱스로 갖는 배열의 값을 증가시킨다.

전체 코드

#include <iostream>
#include <algorithm>
using namespace std;
int n, m, k;
char a[5][5];
int v[5][5];
int dy[4] = {0, 1, 0, -1};
int dx[4] = {-1, 0, 1, 0};
int res[26];
void go(int cnt, int y, int x)
{
    if (y == 0 && x == m - 1)
    {
        res[cnt]++;
        return;
    }
    for (int i = 0; i < 4; i++)
    {
        int ny = y + dy[i];
        int nx = x + dx[i];
        if (ny < 0 || nx < 0 || ny >= n || nx >= m)
            continue;
        if (v[ny][nx] || a[ny][nx] == 'T')
            continue;
        v[ny][nx] = 1;
        go(cnt + 1, ny, nx);
        v[ny][nx] = 0;
    }
}

int main()
{
    cin >> n >> m >> k;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> a[i][j];
        }
    }

    v[n - 1][0] = 1;
    go(1, n - 1, 0);

    cout << res[k] << "\n";
}
profile
다시태어나고싶어요

0개의 댓글