1987번: 알파벳
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으
www.acmicpc.net
- DFS 로 재귀호출 하기 전에 알파벳 방문처리, 호출 끝난 이후 해당 알파벳 방문을 다시 초기화해주는 것이 중요하다.
- 일단 호출하고 함수 초반부에 검사해서 리턴해주기 vs 호출 하기 전 검사해서 안전한 친구들만 호출하기. 무엇을 쓸까?
#include <iostream>
using namespace std;
int R, C, answer;
char board[20][20];
bool checked[26];
int dir[4] = {1, -1, 0, 0};
void dfs(int row, int col, int depth)
{
answer = (depth > answer ? depth : answer); // 현재 방문한 위치까지의 거리 갱신
for(int i = 0 ; i < 4 ; i++) // 상하좌우 4방향에 대해서 검사
{
int nX = row + dir[i];
int nY = col + dir[3-i];
// 인덱스 벗어나거나 이미 방문한 알파벳이면 재귀 X
if(nX < 0 || nX >= R || nY < 0 || nY >= C || checked[board[nX][nY]-65]) continue;
checked[board[nX][nY]-65] = true; // 백트래킹
dfs(nX, nY, depth+1); // 새로운 알파벳일 경우에만 재귀호출로 한칸 움직임 처리
checked[board[nX][nY]-65] = false;
}
}
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> R >> C;
for(int i = 0 ; i < R ; i++)
{
for(int j = 0 ; j < C ; j++)
{
cin >> board[i][j];
}
}
checked[board[0][0] - 65] = true; // 시작점 알파벳 방문처리 한 후 DFS 시작
dfs(0, 0, 1);
cout << answer << endl; // DFS 내에서 갱신된 최댓값 출력
}
'PS > BOJ' 카테고리의 다른 글
[백준] 11052 : 카드 구매하기 (0) | 2020.12.30 |
---|---|
[백준] 1261 : 알고스팟 (0) | 2020.12.29 |
[백준] 1058.py : 친구 (0) | 2020.12.26 |
[백준] 1762 : 평면그래프와 삼각형 (0) | 2020.10.29 |
[백준] 2512 : 예산 (0) | 2020.09.24 |