해보자

백준 14503번 로봇 청소기 본문

C++/Solve & Think

백준 14503번 로봇 청소기

안댕 2020. 4. 19. 07:00

 

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다. 로봇 청소기는 다음

www.acmicpc.net



 

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
#include <iostream>
#include <queue>
 
using namespace std;
 
int N, M;
int map[50][50];
int space = 0;
int space_cnt = 1;
pair<intint> dir[4= {{-10}, {01}, {10}, {0-1}};
queue<pair<intint>> q;
 
bool isPossible(int y, int x) {
     if ( y >= 0 && x >= 0 && y < N && x < M )
          return true;
     return false;
}
void dfs(int y, int x, int d) {
     if ( space_cnt == space){
          return ;
     }
     for(int i=3; i >= 0; i--) {
          int nextD = (d+i)%4;
          int nextY = y + dir[nextD].first;
          int nextX = x + dir[nextD].second;
          if ( isPossible(nextY, nextX) ) {
               if ( map[nextY][nextX] == 0) {
                    map[nextY][nextX] = 2;
                    space_cnt++;
                    dfs(nextY,nextX,nextD);
                    return;
               }
          }
     } 
     int preY = y + dir[d].first * (-1);
     int preX = x + dir[d].second * (-1);
     if ( isPossible(preY, preX)) {
          if (map[preY][preX] == 2) {
               dfs(preY,preX,d);
          }
     }
     return;
}
 
int main()
{
     int r, c, d;
     cin >> N >> M >> r >> c >> d;
     
     for (int i = 0; i < N; i++)
     {
          for (int j = 0; j < M; j++)
          {
               cin >> map[i][j];
               if ( map[i][j] == 0 )
                    space++;
          }
     }
     map[r][c] = 2;
     dfs(r,c,d);
 
     cout << space_cnt << endl;
     return 0;
}
 
 
 
cs

 

 

'C++ > Solve & Think' 카테고리의 다른 글

백준_16234번_인구 이동  (0) 2020.10.08
백준_15686번_치킨 배달  (0) 2020.10.08
프로그래머스_LV2_다리를 지나는 트럭  (0) 2020.02.26
프로그래머스_LV2_기능개발  (0) 2020.02.21
백준_7576번_토마토  (0) 2020.02.20