728x90
문제
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다.
말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.
좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다.
입력
첫째 줄에 R과 C가 빈칸을 사이에 두고 주어진다. (1<=R,C<=20) 둘째 줄부터 R개의 줄에 걸쳐서 보드에 적혀 있는 C개의 대문자 알파벳들이 빈칸 없이 주어진다.
출력
첫째 줄에 말이 지날 수 있는 최대의 칸 수를 출력한다.
좌측 상단부터 알파벳을 최대한 방문하는 문제이다.
다만 이미 방문한 지점은 못 가고, 방문한 적이 있는 알파벳은 방문할 수 없다.
조건이 어렵지 않으니 dfs로 구현만 해주면 된다.
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 |