# 유형 : 시뮬레이션, 구현
# 난이도는 골드 4인데 어렵지 않은 문제였다. 좌표를 거꾸로 줬기 때문에 그거만 생각하여 북쪽으로 이동할때는 y좌표가 감소하는것이 아닌 증가, 남쪽으로 이동할 때는 y좌표가 감소하는 것만 생각하여 이동 좌표를 수정해주면 된다. 백준 홈페이지에는 없는 추가적인 테스트 케이스를 첨부하니 여러 케이스에 대하여 실행해보면 좋을 것 같다.
5 4
2 2
1 1 E
5 4 W
1 F 7
2 F 7 =====> Robot 1 crashes into the wall
5 4
2 4
1 1 E
5 4 W
1 F 3
2 F 1
1 L 1
1 F 3 ======> Robot 1 crashes into robot 2
5 4
2 2
1 1 E
5 4 W
1 L 96
1 F 2 =======> OK
5 4
2 3
1 1 E
5 4 W
1 F 4
1 L 1
1 F 20 =======> Robot 1 crashes into robot 2
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
|
package bj;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class p2174 {
static int A,B,N,M;
static Robot[] robot;
static boolean isTrue=false;
static int check[][];
static int moveX[] = {0,1,0,-1};
static int moveY[] = {1,0,-1,0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
A = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
N= Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
check = new int[B+1][A+1];
robot = new Robot[N+1];
for(int n=1; n<=N; n++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
char dir = st.nextToken().charAt(0);
int d=0;
if(dir=='N')
d = 0;
else if(dir =='E')
d = 1;
else if(dir =='S')
d = 2;
else if(dir == 'W')
d = 3;
check[y][x] = n;
robot[n] = new Robot(x,y,d);
}
for(int m=1; m<=M; m++) {
st = new StringTokenizer(br.readLine());
int num = Integer.parseInt(st.nextToken());
char ch = st.nextToken().charAt(0);
int iter = Integer.parseInt(st.nextToken());
solve(num, ch, iter);
if(isTrue)
break;
}
if(!isTrue)
System.out.println("OK");
}
private static void solve(int num, char ch, int iter) {
// TODO Auto-generated method stub
for(int it=0; it<iter; it++) {
Robot rb = robot[num];
if(ch == 'R' || ch =='L') {
int nextDir = getDir(rb.dir, ch);
robot[num] = new Robot(rb.x, rb.y, nextDir);
}else if(ch == 'F') {
int newX = rb.x + moveX[rb.dir];
int newY = rb.y + moveY[rb.dir];
if(1<=newX && newX<=A && 1<=newY && newY<=B) {
if(check[newY][newX] != 0) {
System.out.println("Robot "+num +" crashes into robot " + check[newY][newX]);
isTrue = true;
return;
}else {
check[rb.y][rb.x] = 0;
check[newY][newX] = num;
robot[num] = new Robot(newX, newY, rb.dir);
}
}else {
System.out.println("Robot "+num+" crashes into the wall");
isTrue = true;
return;
}
}
}
}
public static int getDir(int dir, char ch) {
if(ch == 'L') {
if(dir == 0){
dir = 3;
}else {
dir--;
}
}else if(ch == 'R') {
if(dir==3) {
dir = 0;
}else {
dir++;
}
}
return dir;
}
public static class Robot{
int x;
int y;
int dir;
public Robot(int x, int y, int dir) {
this.x=x;
this.y=y;
this.dir=dir;
}
}
}
|
cs |
'백준' 카테고리의 다른 글
#백준_5427 불 - Java 자바 (0) | 2020.02.20 |
---|---|
#백준_1173 운동 - Java 자바 (0) | 2020.02.20 |
#백준_2931 가스관 - Java 자바 (0) | 2020.02.18 |
#백준_9205 맥주 마시면서 걸어가기 - Java 자바 (0) | 2020.02.17 |
#백준_1592 영식이와 친구들 - Java 자바 (0) | 2020.02.16 |