8000 Update 14503.cpp · windowdong11/basic-algo-lecture@63e8289 · GitHub
[go: up one dir, main page]

Skip to content

Commit 63e8289

Browse files
Update 14503.cpp
1 parent f8cda18 commit 63e8289

File tree

1 file changed

+23
-45
lines changed

1 file changed

+23
-45
lines changed

0x0D/solutions/14503.cpp

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,42 @@
11
// Authored by : OceanShape
2-
// Co-authored by : -
3-
// http://boj.kr/9e6f61018d47427db29d056865f86f39
2+
// Co-authored by : BaaaaaaaaaaarkingDog
3+
// http://boj.kr/20cb691fa33b4098908ba7fc390d45a5
44
#include <bits/stdc++.h>
55
using namespace std;
66

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};
1610

1711
int main(void){
1812
ios::sync_with_stdio(0);
1913
cin.tie(0);
20-
cin >> N >> M >> r >> c >> d;
14+
cin >> N >> M >> x >> y >> d;
2115
for(int i = 0; i < N; ++i)
2216
for(int j = 0; j < M; ++j)
2317
cin >> board[i][j];
24-
2518
int chkCnt = 0; // 방향 탐지 횟수
2619
while(true){
27-
int preAns = ans;
2820
// 청소하지 않은 빈 칸일 경우 청소
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;
5931
}
6032
}
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];
6140
}
62-
6341
cout << ans;
6442
}

0 commit comments

Comments
 (0)
0