728x90

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

 

1987번: 알파벳

세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으

www.acmicpc.net

재귀로 순열, 조합 풀듯이 풀었다. 방문한 뒤에 다시 visited를 false로 바꿔주었다. 한 번 방문했다고 다시 방문을 못하면 그것은 백트래킹이 아니라 DFS이기 때문이다.

#include <vector>
#include <algorithm>
#include <iostream>
#include <map>

using namespace std;

int dr[] = { 1, -1, 0, 0 };
int dc[] = { 0, 0, 1, -1 };
int n, m;
vector<vector<char>> v;
int maxNum = 0;
vector<bool> visited(26);

void dfs(int r, int c, int num) {
	if (num> maxNum)
		maxNum = num;
	for (int i = 0; i < 4; i++) {
		int row = r + dr[i];
		int col = c + dc[i];
		if (row >= n || col >= m || row < 0 || col < 0 || visited[v[row][col] - 'A'])
			continue;
		visited[v[row][col] - 'A'] = true;
		dfs(row, col, num + 1);
		visited[v[row][col] - 'A'] = false;
		
	}
}

int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	cin >> n >> m;
	v = vector<vector<char>>(n, vector<char>(m));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> v[i][j];
		}
	}
	visited[v[0][0] - 'A'] = true;
	dfs(0, 0, 1);
	cout << maxNum;
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 2023번 신기한 소수  (0) 2020.09.01
[백준] 10819번 차이를 최대로  (0) 2020.08.31
[백준] 15683번 감시  (0) 2020.08.30
[백준] 15686 치킨 배달  (0) 2020.08.30
[백준] 2636 치즈  (0) 2020.08.29

+ Recent posts