습관처럼
백준 14503 - 로봇 청소기 본문
https://www.acmicpc.net/problem/14503
문제설명
로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다.
로봇 청소기는 다음과 같이 작동한다.
- 현재 위치를 청소한다.
- 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다.
- 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다.
- 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다.
- 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다.
로봇 청소기는 이미 청소되어있는 칸을 또 청소하지 않으며, 벽을 통과할 수 없다.
접근 방식
기본적으로 로봇청소기가 움직이는 방향을 그대로 dx[] ,dy[]로 잡아서 접근하기 편하게 설정, 후진하는 방향 또한 back_dx[], back_dy[]로 설정한다음 왼쪽우선시 깊이탐색이므로 dfs로 접근하여 진행한다.
규칙에서 북동남서가 모두 청소가 되어있는 경우 후진 조건을 설정하고, 다음으로 후진이 안되는 경우 탐색을 끝낸다.
코드
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
int r,c;
int cnt=0;
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};
//d가 0인 경우에는 북쪽을, 1인 경우에는 동쪽을, 2인 경우에는 남쪽을, 3인 경우에는 서쪽
int back_dx[] = { 1,0,-1,0 };
int back_dy[] = { 0,-1,0,1 };
//후진 하는 경우 북쪽을 남쪽, 동쪽을 서쪽, 남쪽을 북쪽, 서쪽을 동쪽으로
int map[51][51];
void print(int map[][51]){
for(int i=0;i<r;i++){
for(int j=0;j<c;j++) {cout<<map[i][j]<<" ";}
cout<<"\n";
}
}
void dfs(int x, int y,int dir){
if (map[x][y] == 1) return;
if (map[x][y] == 0){
map[x][y] = 2;
cnt++;
}
for (int k = 0; k < 4; k++){
// 북:0 -> 서:3, 동:1 -> 북:0, 남:2 -> 동:1, 서:3 -> 남:2
int ndir = dir-1 < 0 ? 3 : dir-1;
int nx = x + dx[ndir], ny = y + dy[ndir];
if (map[nx][ny] == 0){
dfs(nx, ny, ndir);
return;
}
else dir = ndir;
}
// 네 방향 모두 청소했거나 벽이면 방향을 유지한채로 후진한다.
int nx = x + back_dx[dir], ny = y + back_dy[dir];
dfs(nx, ny, dir);
}
int main(){
int x,y,dir;
cin>>r>>c;
cin>>x>>y>>dir;
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
cin>>map[i][j];
}
}
dfs(x,y,dir);
cout<<cnt<<"\n";
return 0;
}
funny algorithms :0 ~
'Algorithms > BOJ' 카테고리의 다른 글
백준 1120 - 문자열 (0) | 2020.02.06 |
---|---|
백준 1152 - 단어의 개수 (0) | 2020.02.06 |
백준 2455 - 지능형 기차 (0) | 2020.02.04 |
백준 7569 - 토마토 (0) | 2020.01.29 |
백준 1012 - 유기농 배추 (0) | 2020.01.28 |