# 유형 : 구현, 탐색
# 난이도 : 실버 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<M && 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 |
'백준' 카테고리의 다른 글
#백준_3187 양치기 꿍 - Java 자바 (0) | 2020.03.03 |
---|---|
#백준_2234 성곽 - Java 자바 (0) | 2020.03.02 |
#백준_15684 사다리 조작 - Java 자바 (0) | 2020.02.29 |
#백준_1347 미로 만들기 - Java 자바 (0) | 2020.02.29 |
#백준_2933 미네랄 - Java 자바 (0) | 2020.02.27 |