[Silver I] 컴백홈 - 1189

JYC·2024년 1월 2일

[BAEKJOON]

목록 보기
2/102

문제 링크

성능 요약

메모리: 2020 KB, 시간: 0 ms

분류

백트래킹, 브루트포스 알고리즘, 깊이 우선 탐색, 그래프 이론, 그래프 탐색

제출 일자

2024년 1월 2일 16:20:31

문제 설명

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

      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인 문자열이 주어진다.

코드

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <set>

using namespace std;

int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
int r, c, k;
int board[6][6];
bool visited[6][6];
int cnt = 0;

void repeat(int y,int x,int distance){
	if (x == c - 1 && y == 0 && distance == k) {//오른쪽 위 도착하면 끝.
		cnt++;
		return;
	}
	for (int i = 0; i < 4; i++) {
		int nx = x + dx[i];
		int ny = y + dy[i];
		if (nx < 0 || nx >= c || ny < 0 || ny >= r) {
			continue;
		}
		if (visited[ny][nx] || board[ny][nx]) {
			continue;
		}
		visited[ny][nx] = true;
		repeat(ny, nx, distance + 1);
		visited[ny][nx] = false;
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> r >> c >> k;
	char temp;
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			cin >> temp;
			if (temp == 'T') {
				board[i][j] = 1;
			}
		}
	}
	visited[r - 1][0] = true;//왼쪽 아래 점에서 시작
	repeat(r - 1, 0, 1);
	cout << cnt << "\n";
}

참고

[개발자 배씨님 Tistory] 코드를 참고했다. dfs에 대해 완벽히 인지하지 못한 상태에서 문제를 접근해서인지 어렵게 느껴졌던 문제였다.

profile
열심히 하기 1일차

0개의 댓글