# 유형 : 구현, 탐색

# 난이도 : 실버 3

# 난이도치고는 꽤 짜증났던 문제.. 구현+탐색은 항상 귀찮다. 현재 방향과 행성의 종류에 따라 전파 방향을 잘 따져주어야 하고 무엇보다 방문체크 생각없이 2차원으로 했는데, 들어오는 방향에 따라 같은 곳을 두번 방문할수도 있다.( Voyager이 아님에도 불구하고)

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package bj;
 
import java.awt.Point;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class p3987 {
    static int moveX[] = {0,1,0,-1};
    static int moveY[] = {-1,0,1,0};
    static int N,M;
    static char arr[][];
    static boolean visit[][][];
    static boolean isPossible = false;
    static Point start;
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        arr = new char[N][M];
        for(int n=0; n<N; n++) {
            String str = br.readLine();
            for(int m=0; m<M; m++) {
                arr[n][m] = str.charAt(m);
            }
        }
        st = new StringTokenizer(br.readLine());
        int y = Integer.parseInt(st.nextToken())-1;
        int x = Integer.parseInt(st.nextToken())-1;
        start = new Point(x,y);
        int maxValue = 0;
        int direction = 0;
        for(int d=0; d<4; d++) {
            visit = new boolean[N][M][4];
            visit[start.y][start.x][d] = true;
            int rs = solve(d, start);
            if(isPossible) {
                direction = d;
                break;
            }
            if(maxValue < rs) {
                direction = d;
                maxValue = rs;
            }
        }
        char ch;
        if(direction == 0) {
            ch = 'U';
        }else if(direction == 1) {
            ch = 'R';
        }else if(direction == 2) {
            ch = 'D';
        }else{
            ch = 'L';
        }
        
        if(isPossible) {
            System.out.println(ch);
            System.out.println("Voyager");
        }else{
            System.out.println(ch);
            System.out.println(maxValue);
        }
            
        
        
    }
    private static int solve(int d, Point p) {
        int result = 1;
        
        int x = p.x;
        int y = p.y;
        
        while(true) {
            int newX = x + moveX[d];
            int newY = y + moveY[d];
            int newDir = d;
            if(0<=newX && newX<&& 0<=newY && newY<N) {
                if(arr[newY][newX] == 'C')
                    break;
                if(arr[newY][newX] == '.' && visit[newY][newX][newDir]) {
                    isPossible = true;
                    break;
                }
                
                result++;
                
                if(arr[newY][newX] == '/') {
                    newDir = getDir(d, arr[newY][newX]);
                }else if(arr[newY][newX] == '\\'){
                    newDir = getDir(d, arr[newY][newX]);
                }
                
                visit[newY][newX][newDir] = true;
                x = newX;
                y = newY;
                d = newDir;
            }else
                break;
        }
        
        return result;
    }
    private static int getDir(int d, char c) {
        if(c == '/') {
            if(d==0) {
                return 1;
            }else if(d==1) {
                return 0;
            }else if(d==2) {
                return 3;
            }else if(d==3) {
                return 2;
            }
        }else if(c == '\\') {
            if(d==0) {
                return 3;
            }else if(d==1) {
                return 2;
            }else if(d==2) {
                return 1;
            }else if(d==3) {
                return 0;
            }
        }
        // TODO Auto-generated method stub
        return 0;
    }
}
 
cs

+ Recent posts