728x90

문제

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

말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.

좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다.

입력

첫째 줄에 R과 C가 빈칸을 사이에 두고 주어진다. (1<=R,C<=20) 둘째 줄부터 R개의 줄에 걸쳐서 보드에 적혀 있는 C개의 대문자 알파벳들이 빈칸 없이 주어진다.

출력

첫째 줄에 말이 지날 수 있는 최대의 칸 수를 출력한다.


좌측 상단부터 알파벳을 최대한 방문하는 문제이다.

다만 이미 방문한 지점은 못 가고, 방문한 적이 있는 알파벳은 방문할 수 없다.

조건이 어렵지 않으니 dfs로 구현만 해주면 된다.

 

 

코드 원본 : https://github.com/chosh95/STUDY/blob/master/BaekJoon/2020/%EC%95%8C%ED%8C%8C%EB%B2%B3%20(1987%EB%B2%88).cpp

 

chosh95/STUDY

프로그래밍 문제 및 알고리즘 정리. Contribute to chosh95/STUDY development by creating an account on GitHub.

github.com

 

C++ 코드

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int R, C, res;
char p[21][21];
vector<char> v;
int dx[4] = { -1,0,0,1 };
int dy[4] = { 0,-1,1,0 };

bool isPossible(int x, int y) {
	for (int i = 0; i < v.size(); i++) {
		if (v[i] == p[x][y]) return false;
	}
	return true;
}

void dfs(int x, int y, int cnt)
{
	res = max(res, cnt);

	for (int i = 0; i < 4; i++) {
		int nx = x + dx[i];
		int ny = y + dy[i];
		if (nx < 1 || ny < 1 || nx > R || ny > C) continue;
		if (!isPossible(nx, ny)) continue;
		v.push_back(p[nx][ny]);
		dfs(nx, ny, cnt + 1);
		v.pop_back();
	}
}

int main()
{
	cin >> R >> C;
	for (int i = 1; i <= R; i++) 
		for (int j = 1; j <= C; j++) 
			cin >> p[i][j];

	v.push_back(p[1][1]);
	dfs(1, 1, 1);

	cout << res;
}

 

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 음계 (2920번)  (0) 2020.03.06
[백준] 암호 만들기 (1759번)  (0) 2020.03.05
[백준] 로고 (3108번)  (2) 2020.03.05
[백준] 문자판 (2186번)  (0) 2020.03.04
[백준] 보물섬 (2589번)  (0) 2020.03.04

+ Recent posts