|
1 | 1 | // Authored by : OceanShape
|
2 |
| -// Co-authored by : - |
3 |
| -// http://boj.kr/9e6f61018d47427db29d056865f86f39 |
| 2 | +// Co-authored by : BaaaaaaaaaaarkingDog |
| 3 | +// http://boj.kr/20cb691fa33b4098908ba7fc390d45a5 |
4 | 4 | #include <bits/stdc++.h>
|
5 | 5 | using namespace std;
|
6 | 6 |
|
7 |
| -int N, M, r, c, d, board[51][51], ans; |
8 |
| -int dirX[] = {-1, 0, 1, 0}; |
9 |
| -int dirY[] = {0, 1, 0, -1}; |
10 |
| - |
11 |
| -// 해당 위치 청소가 가능한지 알려주는 함수 |
12 |
| -bool canClean(int x, int y){ |
13 |
| - if(board[x][y] == 0) return true; |
14 |
| - return false; |
15 |
| -} |
| 7 | +int N, M, x, y, d, board[51][51], ans; |
| 8 | +int dx[] = {-1, 0, 1, 0}; |
| 9 | +int dy[] = {0, 1, 0, -1}; |
16 | 10 |
|
17 | 11 | int main(void){
|
18 | 12 | ios::sync_with_stdio(0);
|
19 | 13 | cin.tie(0);
|
20 |
| - cin >> N >> M >> r >> c >> d; |
| 14 | + cin >> N >> M >> x >> y >> d; |
21 | 15 | for(int i = 0; i < N; ++i)
|
22 | 16 | for(int j = 0; j < M; ++j)
|
23 | 17 | cin >> board[i][j];
|
24 |
| - |
25 | 18 | int chkCnt = 0; // 방향 탐지 횟수
|
26 | 19 | while(true){
|
27 |
| - int preAns = ans; |
28 | 20 | // 청소하지 않은 빈 칸일 경우 청소
|
29 |
| - if(board[r][c]==0) ++ans; |
30 |
| - board[r][c] = -1; |
31 |
| - |
32 |
| - int chkD = (d+3)%4; // 왼쪽으로 회전 |
33 |
| - // 왼쪽 칸의 청소&통행가 |
34 |
| - if(canClean(r+dirX[chkD], c+dirY[chkD])){ |
35 |
| - d = chkD; // 회전한 방향 대입 |
36 |
| - // 해당 위치로 이동 |
37 |
| - r+=dirX[chkD]; |
38 |
| - c+=dirY[chkD]; |
39 |
| - chkCnt = 0; // 탐지 횟수 초기화 |
40 |
| - } else { |
41 |
| - // 전부 확인하지 못했을 경우 |
42 |
| - if(chkCnt != 4){ |
43 |
| - d = chkD; |
44 |
| - ++chkCnt; |
45 |
| - } |
46 |
| - // 네 방향을 전부 확인했을 경우 |
47 |
| - else { |
48 |
| - int backD = (d+2)%4; |
49 |
| - // [뒤가 벽으로 막혀 있으면, 로봇 청소기 종료] |
50 |
| - if(board[r+dirX[backD]][c+dirY[backD]]==1){ |
51 |
| - break; |
52 |
| - } |
53 |
| - // 막혀 있지 않을 경우, 후진 |
54 |
| - else { |
55 |
| - r+=dirX[backD]; |
56 |
| - c+=dirY[backD]; |
57 |
| - chkCnt = 0; |
58 |
| - } |
| 21 | + if(board[x][y]==0) ++ans; |
| 22 | + board[x][y] = -1; // 청소된 칸이라고 표시 |
| 23 | + bool cleaned = false; // 네 방향 중 청소가 된 곳이 있는지 |
| 24 | + for(int i = 0; i < 4; i++){ |
| 25 | + d = (d+3) % 4; // 왼쪽으로 회전 |
| 26 | + if(board[x+dx[d]][y+dy[d]] == 0){ |
| 27 | + x += dx[d]; |
| 28 | + y += dy[d]; |
| 29 | + cleaned = true; |
| 30 | + break; |
59 | 31 | }
|
60 | 32 | }
|
| 33 | + if(cleaned) continue; |
| 34 | + // 뒤가 벽으로 막혀 있으면, 로봇 청소기 종료 |
| 35 | + if(board[x-dx[d]][y-dy[d]] == 1) |
| 36 | + break; |
| 37 | + // 막혀 있지 않을 경우, 후진 |
| 38 | + x -= dx[d]; |
| 39 | + y -= dy[d]; |
61 | 40 | }
|
62 |
| - |
63 | 41 | cout << ans;
|
64 | 42 | }
|
0 commit comments