다른 풀이 보니까 dfs로 푸는 경우도 있지만 그게 더 복잡할꺼 같아서 while문을 사용했다.
조건을 잘못 읽어서 처음에 테케도 통과를 못시켰다ㅠ
조건을 잘 보면
1. 현재 위치를 청소
2. 현재 위치에서 왼쪽 방향으로 회전.
2-1. 왼쪽 회전 시에 앞에 청소 안한 칸이 있다면 전진 -> 1
2-2. 청소를 했거나 벽이다. -> 다시 왼쪽 회전
2-3. 4방향 모두 벽 or 청소한 구역 -> 원래 방향에서 후진(청소한 구역도 후진 가능)
2-4. 후진하는 방향이 벽이라면 작동을 멈춤
처음에 2-3.에서 후진할 경우 청소한 구역도 후진이 가능하다는 조건을 빼먹었다. ㅠㅡㅠ
dirr과 dirc자체를 d=0일때 왼쪽 회전해서 전진하는 좌표값으로 넣어놨다.
그래서 4번 회전하며 다음 칸이 청소안한 구역이면 현재 위치와 방향을 변경한다.
4번 회전해서 제자리라면 (flag = false) 후진하여 벽인지 확인한다.
벽이면 while을 종료 그렇지 않으면 현재 위치만 변경하여 다시 진행한다.
#include <stdio.h>
using namespace std;
int n, m;
int r, c, d;
int arr[50][50];
int dirr[4] = {0, -1, 0, 1};
int dirc[4] = {-1, 0, 1, 0};
int backr[4] = {1, 0, -1, 0};
int backc[4] = {0, -1, 0, 1};
int main(void)
{
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", &arr[i][j]);
}
}
int cnt = 0;
while (1)
{
if (arr[r][c] == 0)
{
arr[r][c] = -1;
cnt++;
}
bool flag = false;
for (int i = 0; i < 4; i++)
{
int nextR = r + dirr[d];
int nextC = c + dirc[d];
int nextD = d - 1 < 0 ? 3 : d - 1;
if (arr[nextR][nextC] == 0)
{
flag = true;
r = nextR, c = nextC, d = nextD;
break;
}
d = nextD;
}
if (flag)
{
continue;
}
int backR = r + backr[d];
int backC = c + backc[d];
if (arr[backR][backC] == 1)
{
break;
}
r = backR;
c = backC;
}
printf("%d\n", cnt);
return 0;
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 6064] 카잉 달력 (0) | 2020.12.18 |
---|---|
[백준 15684] 사다리 조작 (0) | 2020.12.17 |
[백준 14499] 주사위 굴리기 (0) | 2020.12.17 |
[백준 15686] 치킨 배달 (0) | 2020.12.16 |
[백준 15683] 감시 (0) | 2020.12.16 |
댓글