알고리즘 및 자료구조/구현
[알고리즘] 백준 14503 로봇 청소기
Sh_Blog
2023. 12. 23. 00:45
백준 14503
https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$ 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽
www.acmicpc.net
풀이 전 나의 생각
오랜만에 푸는 양방향 탐색이어서 굉장히 헷갈렸다..
정말 조건 그대로 코드를 짜면 풀리는 문제이긴 한데 엄청 헤멨던 부분이 있어서
인터넷을 찾아보고 겨우겨우 풀었다.
우선 이 문제에서 중요한 부분은
1. 양방향 탐색은 현재 로봇 청소기 방향을 기준으로 하니 dx, dy 값을 0, 1, 2, 3의 각 방향에 맞게 설정해줘야 한다.
2. 로봇 청소기가 주변 4곳의 탐색이 끝난 후 다시 원래 방향으로 돌아와야 하니 미리 방향을 왼쪽으로 꺾어서 탐색한다 -> (d + 3) % 4
3. 벽을만나면 무조건 종료.
이 3가지를 주의해서 풀면 좋다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
int room[52][52];
bool cleaned[52][52];
int dx[4] = { -1, 0, 1, 0 };
int dy[4] = { 0, 1, 0, -1 };
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m, r, c, d, cnt = 0;
cin >> n >> m >> r >> c >> d;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> room[i][j];
}
}
while (true)
{
if (cleaned[r][c] == false)
{
cleaned[r][c] = true;
cnt++;
}
bool isClean = false;
for (int i = 0; i < 4; i++)
{
d = (d + 3) % 4;
int nx = r + dx[d];
int ny = c + dy[d];
if (room[nx][ny] == 0 && cleaned[nx][ny] == false)
{
r += dx[d];
c += dy[d];
isClean = true;
break;
}
}
if (!isClean)
{
int back = (d + 2) % 4;
if (room[r + dx[back]][c + dy[back]] == 1) break;
r += dx[back];
c += dy[back];
}
}
cout << cnt;
}