문제에서 제시한 조건만 지켜서 탐색하면 완료되는 문제이다.
단, 처음 로봇방향을 제시하고, 로봇 방향기준 왼쪽부터 순차대로 탐색해야하므로 다음 탐색할 장소와
로봇 청소기 방향에만 신경써주자.
혹시 에러가 뜬다면 맵 크기나 범위 제한을 잘 해주자.
또한 종료조건이 단 하나 뿐인 것도 유념해두자.
전체 코드
#include <stdio.h>
int N, M;
int Map[51][51];
int visited[51][51];
int r, c, d;
int dy[] = { -1,0,1,0 }; // 0 : 북 1 : 동 2 : 남 3 : 서
int dx[] = { 0,1,0,-1 };
//d 기준 왼쪽은 d-1;
int move() {
int cnt = 0;
int left = d-1+(d-1<0?4:0);
int repeat = 0;
while (1) {
//printf("cnt %d left %d repeat %d r : %d c: %d\n", cnt, left, repeat, r, c);
//4방향 다 청소할게 없을 경우
if (repeat >= 4) {
left= d - 2 + (d - 2 < 0 ? 4 : 0);
//뒤로 이동하려는데 벽일 경우 종료
if (Map[r + dy[left]][c + dx[left]]) break;
//뒤로이동
r += dy[left];
c += dx[left];
//초기화
repeat = 0;
left = d - 1 + (d - 1 < 0 ? 4 : 0);
continue;
}
//만약 청소한 적이 없는 곳이라면 청소
if (!visited[r][c]) {
visited[r][c] = 1;
cnt++;
}
//청소기 방향 기준 왼쪽 탐색
int ny = r + dy[left];
int nx = c + dx[left];
//범위 안일 경우
if (ny < N && ny >= 0 && nx < M && nx >= 0) {
//청소한 곳이라면 방향만 돌림
if (visited[ny][nx]) {
left = left - 1 + (left - 1 < 0 ? 4 : 0);
repeat++;
continue;
}
//벽이여도 방향만 돌림
if (Map[ny][nx]) {
left = left - 1 + (left - 1 < 0 ? 4 : 0);
repeat++;
continue;
}
//갈 수 있는 곳이라면 이동
r = ny;
c = nx;
d = left;
repeat = 0;
left = d- 1 + (d - 1 < 0 ? 4 : 0);
}
//범위 밖일 경우청소기 방향돌림
else {
left = left - 1 + (left - 1 < 0 ? 4 : 0);
repeat++;
continue;
}
}
return cnt;
}
int solve() {
int ret = 0;
ret = move();
return ret;
}
int main() {
scanf("%d %d", &N, &M);
scanf("%d %d %d", &r, &c, &d);
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%d", &Map[i][j]);
}
}
int ans = solve();
printf("%d", ans);
}
'알고리즘' 카테고리의 다른 글
백준 20061 모노미노도미노2 C풀이 - Brute Force (0) | 2021.04.08 |
---|---|
백준 14890 경사로 C풀이 (0) | 2021.04.07 |
백준 1068 트리 C 풀이 - 트리 (0) | 2021.04.06 |
백준 12100 2048(Easy) C 풀이 - DFS (0) | 2021.04.05 |
백준 17472 다리만들기2 C 풀이 - MST, DFS (0) | 2021.04.04 |