문제 링크 : https://www.acmicpc.net/problem/14503
풀이
시뮬레이션 문제입니다!
이 문제는 조건이 조금 까다로운데,
나는 4가지 조건 중 c,d 번 먼저 해결하려고 하였다.
왜냐하면 c,d번을 만족시킬때 (네 방향 모두가 벽이거나 청소된 상태) 절대 a,b 번을 수행할 수 없기 때문이다.
따라서 우선 4방향을 탐색 후 뒤쪽 방향이 벽이면 d번, 아니면 c번을 하고,
탐색 결과가 c,d번을 만족시키지 않는 경우, 왼쪽 방향을 보고 a번 또는 b번을 수행시키도록 한다.
문제를 풀 때 변수로 만들어주어야 할 부분은
1. 로봇 청소기의 현재 방향과 위치
2. N x M 크기의 지도
3. 로봇 청소기가 바라보는 방향의 반대 방향 (후진을 할 수 있는지 판별하기 위함)
이 정도이며, 이 문제에서 주어지는 방향 (0은 북쪽, 1은 동쪽, 2는 남쪽, 3은 서쪽) 에 대한 왼쪽방향을 구하기 위해
서쪽을 제외하고는 현 방향에 +1 씩 해주었고(서쪽은 0), 후진 방향은 방향에 따라서 +2 또는 -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
|
#include <iostream>
using namespace std;
int board[50][50];
int dy[4] = { -1, 0, 1, 0 };
int dx[4] = { 0, 1, 0, -1 };
int main()
{
int n, m; scanf("%d %d", &n, &m);
int r, c, d; scanf("%d %d %d", &r, &c, &d);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &board[i][j]);
}
}
int ans = 0;
while (1) {
if (board[r][c] == 0) {
ans++;
board[r][c] = 2;
}
//c,d 번 check
bool check = false;
for (int i = 0; i < 4; i++) {
if (0 <= r + dy[i] && r + dy[i] < n && 0 <= c + dx[i] && c + dx[i] < m) {
if (board[r + dy[i]][c + dx[i]] == 0) check = true;
}
}
int temp_back = 0; //뒤쪽 방향 구하기
if (d < 2) temp_back = d + 2;
else temp_back = d - 2;
if (!check && board[r + dy[temp_back]][c + dx[temp_back]] == 1) { //d번 사례
break;
}
if (!check) { //c번 사례
r = r + dy[temp_back];
c = c + dx[temp_back];
continue;
}
int temp_left = 0; // 왼쪽 방향 구하기
if (d > 0) temp_left = d - 1;
else temp_left = 3;
if ((0 <= r + dy[temp_left] && r + dy[temp_left] < n && 0 <= c + dx[temp_left] && c + dx[temp_left] < m) && board[r + dy[temp_left]][c + dx[temp_left]] == 0) { //a번 사례
r = r + dy[temp_left];
c = c + dx[temp_left];
d = temp_left;
continue;
}
else {
d = temp_left;
continue;
}
}
printf("%d\n", ans);
return 0;
}
|
cs |
개발환경 : Visual Studio 2019
지적, 조언 언제든지 환영입니다~~
'백준 문제풀이' 카테고리의 다른 글
백준 11066번 파일 합치기 (0) | 2020.02.12 |
---|---|
백준 2252번 줄 세우기 (0) | 2020.02.12 |
백준 14499번 주사위 굴리기 (0) | 2020.01.27 |
백준 15658번 연산자 끼워넣기 2 (0) | 2020.01.20 |
백준 1248번 맞춰봐 (0) | 2020.01.20 |