홍시홍의 프로그래밍

[백준 1987] 알파벳 본문

알고리즘 문제풀이/백준

[백준 1987] 알파벳

홍시홍 2020. 1. 13. 01:22

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

 

1987번: 알파벳

문제 세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다. 좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는

www.acmicpc.net

요구사항

최대로 이동할 수 있는 거리 구하기

 

풀이

알파벳을 중복해서 지나가면 안되니 알파벳 방문 여부를 dfs로 확인해주어 이동한다

 

#include <iostream>

using namespace std;
char map[21][21];
int n, m;
int dr[4] = { -1,0,1,0 };
int dc[4] = { 0,-1,0,1 };
int visit[1500];
int ans = 0;
void dfs(int r, int c, int cnt) {
	
	if (ans < cnt) {
		ans = cnt;
	}
	//cout << "R" << r << "C" << c << endl;
	for (int i = 0; i < 4; i++) {
		int nr = r + dr[i];
		int nc = c + dc[i];
		if (nr < 0 || nc < 0 || nr >= n || nc >= m) {
			continue;
		}
		if (visit[map[nr][nc]] == 0) {
		//	cout << "nr" << nr << "nc" << nc << endl;
			visit[map[nr][nc]] = 1;
			dfs(nr, nc, cnt + 1);
			visit[map[nr][nc]] = 0;
		}
	}
}

int main() {
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			scanf(" %c", &map[i][j]);
		}
	}
	visit[map[0][0]] = 1;
	dfs(0, 0, 1);
	cout << ans << endl;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 1261] 알고스팟  (0) 2020.01.14
[백준 1238] 파티  (0) 2020.01.14
[백준 2468] 안전 영역  (0) 2020.01.13
[백준 2583] 영역 구하기  (0) 2020.01.13
[백준 6603] 로또  (0) 2020.01.13
Comments