Notice
Recent Posts
Link
정화 코딩
[C++] 알파벳 (백준 1987번) 본문
https://www.acmicpc.net/problem/1987
#include <iostream>
#include <vector>
using namespace std;
int r, c;
vector<string> m;
bool vst[26];
int maxc = 0;
int di[] = {1, -1, 0, 0};
int dj[] = {0, 0, 1, -1};
void dfs(int curi, int curj, int cnt) {
if (cnt > maxc) maxc = cnt;
for (int k = 0; k < 4; k++) {
int nxti = curi + di[k];
int nxtj = curj + dj[k];
if (nxti >= 0 && nxti < r && nxtj >= 0 && nxtj < c && !vst[m[nxti][nxtj] - 'A']) {
vst[m[nxti][nxtj] - 'A'] = true;
dfs(nxti, nxtj, cnt + 1);
vst[m[nxti][nxtj] - 'A'] = false;
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> r >> c;
m = vector<string>(r);
for (int i = 0; i < r; i++) {
cin >> m[i];
}
vst[m[0][0] - 'A'] = true;
dfs(0, 0, 1);
cout << maxc << '\n';
}
전형적인 dfs 문제였다. 알파벳 보드 m 배열과 해당 알파벳을 방문했는지 여부 vst 배열 등을 전역으로 정의한다. dfs 함수에서는 상하좌우로 움직이면서 vst 배열을 체크하고 만약 갈 수 있다면 해당 알파벳의 vst를 true로 만들고 dfs 함수를 호출 후 다시 vst를 false로 만드는 식으로 구현했다. (AC)
'PS' 카테고리의 다른 글
[C++] 벽 부수고 이동하기 (0) | 2024.11.26 |
---|---|
[C++] 내려가기 (백준 2096번) (0) | 2024.11.25 |
[C++] 별 찍기 - 11 (백준 2448번) (0) | 2024.11.23 |
[C++] 특정한 최단 경로 (백준 1504번) (0) | 2024.11.21 |
[C++] 트리의 지름 (백준 1967번) (0) | 2024.11.19 |
Comments