문제를 천천히 읽어보자....
대충 보면 R x C grid가 있고 이미 방문한 알파벳은 방문이 불가능하다.
최대로 멀리 갈 수 있는 경로를 찾아라? 이렇게 해석이 된다... 그렇다면 dfs를 도입해서 생각해보자.
일단 머리에 하나의 코드를 넣고, 나의 정답 코드와 비교를 해보자.
void dfs(int x)
{
visited[x] = true;
cout << x << " ";
for (int i = 0; i < graph[x].size(); i++) // 인접한 노드 사이즈만큼 탐색
{
int y = graph[x][i];
if (!visited[y]) // 방문하지 않았으면 즉 visited가 False일 때 not을 해주면 True가 되므로 아래 dfs 실행
dfs(y); // 재귀적으로 방문
}
}
void solve(int x, int y, int m) {
visited[arr[y][x] - 'A'] = 1;
if (ans < m)
ans = m;
for (int i = 0; i < 4; i++) {
int cx = x + dx[i];
int cy = y + dy[i];
if (cx >= 0 && cy >= 0 && cx < w && cy < h) {
if (visited[arr[cy][cx] - 'A'] != 1) {
solve(cx, cy, m + 1);
}
}
}
visited[arr[y][x] - 'A'] = 0;
}
생긴거만 보면 거의 동일하며, 문제에 맞게 조금만 변형이 되어 있다.
#include <iostream>
#include <vector>
using namespace std;
char arr[21][21];
int visited[26] = { 0, };
int ans = 1;
int h, w;
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { 1, 0, -1, 0 };
//dfs 돌리면서 계속 m과 ans의 값을 비교하며 업데이트한다.
void solve(int x, int y, int m) {
visited[arr[y][x] - 'A'] = 1;
if (ans < m)
ans = m;
for (int i = 0; i < 4; i++) {
int cx = x + dx[i];
int cy = y + dy[i];
if (cx >= 0 && cy >= 0 && cx < w && cy < h) {
if (visited[arr[cy][cx] - 'A'] != 1) {
solve(cx, cy, m + 1);
}
}
}
visited[arr[y][x] - 'A'] = 0;
}
int main() {
cin >> h >> w;
for (int i = 0; i < h; i++) {
for (int k = 0; k < w; k++) {
cin >> arr[i][k];
}
}
solve(0,0,1);
cout << ans;
return 0;
}
'개발공부 > 백준풀이' 카테고리의 다른 글
백준 1068 c++ 트리 그래프문제 (1) | 2024.11.12 |
---|---|
백준 9019 C++ bfs (0) | 2024.11.11 |
2630 백준 C++ (0) | 2024.10.27 |
백준11057 C언어 (0) | 2024.05.16 |
백준 9095 C언어 (0) | 2024.05.14 |