※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 3109번 문제인 빵집이다.
문제는 아래 링크를 확인하자.

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

 

3109번: 빵집

유명한 제빵사 김원웅은 빵집을 운영하고 있다. 원웅이의 빵집은 글로벌 재정 위기를 피해가지 못했고, 결국 심각한 재정 위기에 빠졌다. 원웅이는 지출을 줄이고자 여기저기 지출을 살펴보던

www.acmicpc.net

주어지는 지형에서 가장 왼쪽 열에서 오른쪽 열까지 이을 수 있는 파이프의 개수를 세는 문제이다.

 

이 문제는 왼쪽 열의 가장 위칸서부터 출발하여 오른쪽 열로 도달할 수 있는지를 확인하면서 방문한 칸을 다시 방문하지 못하게 처리하는 것으로 문제를 해결할 수 있다.

 

이러한 방식이 통하는 이유는 각 칸을 이번 시도에 방문하여 오른쪽 열에 도달할 수 없다면 다른 시도에서 다시 방문하더라도 오른쪽 끝으로 갈 수 없기 때문이다. (또한, 도달했다면 모든 파이프가 지나는 칸은 달라야한다는 조건에 따라 해당 칸을 다시 이용할 수 없고, 가장 위칸서부터 출발한 이 경로로 이동하면 같은 칸을 경유하는 다른 경로에 비해 존재할 수 있는 다른 가능한 가능성을 배제하지 않는다는 점을 생각하자.)

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
using namespace std;

int R, C;
string field[10002];

int dfs(int r, int c) {
	if (c == C - 1) return 1;
	if (field[r - 1][c + 1] == '.') {
		field[r - 1][c + 1] = 'x';
		if (dfs(r - 1, c + 1)) return 1;
	}
	if (field[r][c + 1] == '.') {
		field[r][c + 1] = 'x';
		if (dfs(r, c + 1)) return 1;
	}
	if (field[r + 1][c + 1] == '.') {
		field[r + 1][c + 1] = 'x';
		if (dfs(r + 1, c + 1)) return 1;
	}

	return 0;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> R >> C;
	for (int c = 0; c < C; c++) field[0] += 'x';
	for (int c = 0; c < C; c++) field[R + 1] += 'x';
	for (int r = 1; r <= R; r++) cin >> field[r];

	int ans = 0;
	for (int r = 1; r <= R; r++) {
		ans += dfs(r, 0);
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 14891 // C++] 톱니바퀴  (0) 2021.09.17
[BOJ 13904 // C++] 과제  (0) 2021.09.16
[BOJ 19598 // C++] 최소 회의실 개수  (0) 2021.09.14
[BOJ 14419 // C++] Foehn Phenomena  (0) 2021.09.13
[BOJ 8986 // C++] 전봇대  (0) 2021.09.12

+ Recent posts