https://www.acmicpc.net/problem/1987



이미 방문하여 검사한 부분은 확인하지 않고 
인접한 방향으로 최대한 얼마만큼 갈 수 있는지에 대한 문제이다. 


처음에 한 번이라도 방문했는지에 대한 검사를 수행할 때
보드에서 해당 좌표를 visited로 체크 했는지 검사 했다.
그런데 보드의 좌표를 검사하지 않아도 해당 알파벳을 이전에 방문했는지만 알면 된다.




즉, 이전에 방문하지 않은 지점이 있다고 하더라도 그 지점이 이전에 방문한 지점의 알파벳과 같다면 방문할 수 없다. 

포인트는 방문한 위치가 아니라 방문한 지점의 알파벳이다.



예를 들어 이전에 방문한 지점의 알파벳인 'A'를 visited로 확인했다면, 

visited로 체크된 'A'알파벳이 있는 지점은 (이전에 이 지점을 방문했든 안 했든) 갈 수가 없는 곳이다. 

굳이 이전에 방문한 부분의 좌표를 검사하지 않아도 된다. 

어차피 'A'가 있는 모든 부분은 갈 수가 없기 때문이다.




알파벳이 'A'부터 'Z'까지 주어지는데
문자를 int형으로 변환하면 10진수로 각각 65와 90의 값이다.
'A'의 경우 int로 형 변환 한 다음에 65를 빼준 값인 "0"을 위치로 설정하고 
'Z'는 배열의 25번째 위치로 설정했다.



그리고 dfs 함수를 호출하기 전에 방문한 지점의 알파벳을 방문한 것으로 체크하고
dfs를 호출한 다음에는 좀 전에 방문한 지점의 알파벳을 방문하지 않은 것으로 체크했다.
(다른 경로로 가는 경우도 모두 구하기 위해)




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <algorithm>
using namespace std;
 
int dy[4]={1,-1,0,0};
int dx[4]={0,0,1,-1};
 
int R,C;
int ans=0;
char board[20][20]={0};
int alphabet[26]={0}; //A~Z
 
void dfs(int y,int x,int cnt){
    
    ans=max(ans,cnt);
    
    for(int i=0;i<4;i++){
        int ny=y+dy[i];
        int nx=x+dx[i];
        
        if(ny<0 || ny>=|| nx<0 || nx>=C)
            continue;
        
        //A:65 Z:90
        int k=(int)board[ny][nx]-65;
        if(alphabet[k])
            continue;
        
        alphabet[k]++;
        dfs(ny,nx,cnt+1);
        alphabet[k]--;
        
    }
}
int main(){
    
    cin>>R>>C;
    
    for(int i=0;i<R;i++)
        for(int j=0;j<C;j++){
            cin>>board[i][j];
        }
 
    alphabet[(int)board[0][0]-65]++//(0,0)지점 방문 체크
    dfs(0,0,1);
    
    cout<<ans<<endl;
    
    return 0;
}
cs


'알고리즘(BOJ) > DFS' 카테고리의 다른 글

백준 1707번 - 이분 그래프  (0) 2018.01.28
백준 6603번 - 로또  (0) 2018.01.28
백준 2468번 - 안전 영역  (3) 2018.01.28
백준 2583번 - 영역 구하기  (2) 2018.01.28
백준 2667번 - 단지번호붙이기  (0) 2018.01.28

+ Recent posts