본문 바로가기

백준 문제풀이/Back Tracking

[C++] 백준 문제풀이 (BackTracking) 1189번 컴백홈

 

 

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

 

1189번: 컴백홈

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

www.acmicpc.net

 

 

 

#include <bits/stdc++.h>
// [C++] 백준 문제풀이 (BackTracking)

int r, c, k;
std::string map[5];
int ret;
const int dy[] = {0, 0, -1, 1};
const int dx[] = {-1, 1, 0, 0};
bool visit[5][5];

void dfs(int y, int x, int dist){
	visit[y][x] = true;
	if (y == 0 && x == c - 1){
		if (dist == k) ++ret;
		return;
	}

	for (int dir = 0; dir < 4; ++dir){
		int ny = y + dy[dir];
		int nx = x + dx[dir];
		if (ny < 0 || ny >= r || nx < 0 || nx >= c) continue;
		if (visit[ny][nx]) continue;
		if (map[ny][nx] == 'T') continue;
		dfs(ny, nx, dist + 1);
		visit[ny][nx] = false;
	}
}


int main(int argc, char *argv[])
{
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(nullptr);

	std::cin >> r >> c >> k;

	for (int i = 0; i < r; ++i){
		std::cin >> map[i];
	}

	dfs(r - 1, 0, 1);

	std::cout << ret << "\n";
	return 0;
}