반응형
#include<iostream>
#include<algorithm>
using namespace std;
int alphabet[26] = {0,};
char graph[21][21] = {0,};
int r,c;
int result = 0;
int y[4] = {0,0,-1,1};
int x[4] = {-1,1,0,0};
void dfs(int ny, int nx, int cnt){
if(result < cnt){
result = cnt;
}
for(int i=0; i<4; i++){
int py = ny + y[i];
int px = nx + x[i];
if(0<= py & py < r & 0<= px & px < c & alphabet[graph[py][px]-65] == 0){
alphabet[graph[py][px]-65] = 1;
dfs(py, px, cnt+1);
alphabet[graph[py][px]-65] = 0;
}
}
}
int main(){
cin >> r >> c;
for(int i=0; i<r; i++){
for(int j=0; j<c; j++){
cin >> graph[i][j];
}
}
alphabet[graph[0][0]-65] = 1;
dfs(0,0,1);
cout << result;
}
설명
BFS로 하면 귀찮아지는 이유는 문제상에서 한번 알파벳을 지나간 자리는 다시 지나갈 수 없기 때문에, 큐를 이용한 BFS로 구현하면, 큐에 카운트까지 같이 담고, 그 카운트를 따로 배열에 다 할당해줬다가, 함수가 완전히 끝났을 때, 카운트 중 가장 큰 값을 빼는 그런 자잘한 연산이 많아진다. 그래서 백트래킹을 활용하는 DFS를 사용해야하지않나싶다. (물론 필자는 그냥 분류에 깊이 우선 탐색이라고 쓰여있어서 그렇게 풀었다.)
반응형
'코딩 이야기 > 백준 풀이' 카테고리의 다른 글
백준 10819번: 차이를 최대로 C++ 코드(브루트포스, Bruteforce) (0) | 2021.11.19 |
---|---|
백준 2512번: 예산 C++코드(이진 탐색) (0) | 2021.11.07 |
백준 16953번: A -> B C++ 코드(BFS) (0) | 2021.08.18 |
백준 1926번: 그림 C++코드(BFS) (0) | 2021.08.05 |
백준 2193번: 이친구 C++코드(DP, 다이나믹 프로그래밍) (0) | 2021.08.03 |