[C++]백준1987번 알파벳

1 minute read

오늘은 백준1987번 알파벳 문제를 풀어보도록 하자.

일반적인 DFS문제이다. 방문처리 외 하나 더 추가할 점은 알파벳을 중복해서 거쳐갈 수 없기 때문에 alpha[26]배열을 선언하여 알파벳을 거쳐갔던 적이 있냐를 한 번 더 체크를 해주어야 한다는 점이다.

문제는 다음과 같다.

                               [접근법]

  1. 일반적인 DFS와 같다. 계속해서 cnt와 answer을 비교해주고 재귀를 통해 최댓값을 갱신해주면 된다.
                                     [코드]
#include <iostream>
#include <string>
using namespace std;

char map[20][20];
bool visit[20][20];
bool alpha[26];
int dir[4][2] = { {-1,0},{0,1},{1,0},{0,-1} };
int R, C, answer = -1;

bool Inbound(int y, int x) {
	return y >= 0 && y < R && x >= 0 && x < C;
}

void dfs(int y, int x, int cnt) {
	if (cnt > answer)answer = cnt;
	visit[y][x] = true; alpha[map[y][x] - 'A'] = true;
	for (int i = 0; i < 4; i++) {
		int my = y + dir[i][0];
		int mx = x + dir[i][1];

		if (Inbound(my, mx)) {
			if (!visit[my][mx] && !alpha[map[my][mx] - 'A']) {
				dfs(my, mx, cnt + 1);
				visit[my][mx] = false; alpha[map[my][mx] - 'A'] = false;
			}
		}
	}
}

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

	cin >> R >> C;

	for (int i = 0; i < R; i++) {
		string s = "";
		cin >> s;
		for (int j = 0; j < C; j++) {
			map[i][j] = s[j];
		}
	}
	dfs(0,0,1);
	cout << answer;
}