시뮬레이션 문제이다. 주어진 조건을 만족하게 로봇을 이동시킨다. 처음에 갈 수 있는 곳이 있는지 확인한 후에 갈 수 있을 때와 없을 때를 나누어 코딩했다.
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
|
#include <iostream>
#include <vector>
using namespace std;
int dx[] = {-1,0,1,0}; // up right down left
int dy[] = { 0,1,0,-1};
int clean[51][51];
int N, M;
int solve(vector <vector <int> > &map, int x, int y, int dir, int cnt) {
if (clean[x][y] == 0) {
cnt++;
clean[x][y] = 1;
}
bool flag = false;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i]; int ny = y + dy[i];
if (nx < 0 || nx >= N || ny < 0 || ny >= M) continue;
if (map[nx][ny] != 1 && clean[nx][ny] == 0) { flag = true; break; }
}
int t = dir;
if (flag) {
if (t - 1 < 0) t = 3;
else t = t - 1;
int nx = x + dx[t]; int ny = y + dy[t];
if (nx < 0 || nx >= N || ny < 0 || ny >= M) {
solve(map, x, y, t, cnt);
}
else if (map[nx][ny] == 1 || (clean[nx][ny]==1 && map[nx][ny] ==0)) {
solve(map, x, y, t, cnt);
}
else if (map[nx][ny] != 1 && clean[nx][ny] == 0) {
solve(map, nx, ny, t, cnt);
}
}
else {
int k = dir;
int nx = x + dx[(k + 2) % 4];
int ny = y + dy[(k + 2) % 4];
if (map[nx][ny] == 1) {
return cnt;
}
else {
solve(map, nx, ny, k, cnt);
}
}
}
int main() {
cin >> N >> M;
int r, c, dir; cin >> r >> c >> dir;
vector <vector <int> > map(N, vector<int>(M));
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> map[i][j];
}
}
int ans = solve(map, r, c, dir, 0);
cout << ans << '\n';
return 0;
}
|
cs |
반응형
'Computer Science > Algorithm' 카테고리의 다른 글
[Algorithm] 인덱스 트리(Indexed Tree) (0) | 2019.01.12 |
---|---|
[BOJ 14502] 연구소 (0) | 2018.10.18 |
[BOJ 14890] 경사로 (0) | 2018.10.17 |
[BOJ 14889] 스타트와 링크 (0) | 2018.10.17 |
[BOJ 14891] 톱니바퀴 (0) | 2018.10.17 |