카테고리 없음
[백준] 로봇 청소기 14503번 (c++) 구현
salmon16
2024. 9. 22. 12:16
출처 : https://www.acmicpc.net/problem/14503
풀이 방법
로봇 청소기의 작동 방법 설명에 따라 그대로 코드로 구현했다.
먼저 방향을 북, 동, 남, 서 순서로 0번 인텍스에서 3번 인덱스까지 정장한다.
90도 반시계 방향으로 회전하는 방법은 현재 방향의 인덱스에 +3을 한 후 4로 나누었을 때 나머지를 통해 구하고
후진하는 방법은 현재 방향의 인덱스에 +2를 한 후 나머지 4 연산을 통해 구현했다.
그 후 각 방향에서 앞칸이 방안인지 벽인지, 청소 가능 구역인지를 판단한 후 설명 방법에 따라 구현을 했다.
청소를 완료한 칸은 2로 설정했다.
#include <iostream>
#include <vector>
using namespace std;
int dy[4] = {-1, 0, 1, 0}; // 북, 동, 남, 서
int dx[4] = {0, 1, 0, -1};
int N, M;
int y, x, d;
vector<vector<int> > room;
int cnt;
bool isRoom(int yy, int xx) { //방 안인지 판별하는 함수
if (yy >= 0 && yy < N && xx >= 0 && xx < M) {
return true;
}
else return false;
}
void move(int yy, int xx, int dir) {
if (room[yy][xx] == 0) { //현재 칸이 청소가 되지 않은 경우
cnt++;
room[yy][xx] = 2; // 2를 청소 완료 칸이라 가정
}
bool flag = false; // 청소 되지 않은 빈칸의 존재 여부
for (int i = 0;i < 4;i++) {
int ny = yy + dy[i];
int nx = xx + dx[i];
if (isRoom(ny, nx)) { // 방 안이다.
if (room[ny][nx] == 0) { // 청소 안된 빈칸 존재.
flag = true;
}
}
}
if (flag) { // 청소 안된 빈칸이 존재하는 경우
dir = (dir + 3) % 4; // 90도 반시계 회전
int ny = yy + dy[dir], nx = xx + dx[dir];
if (room[ny][nx] == 0) { // 앞 칸이 청소 안되어 있으면 이동
move(ny, nx, dir);
}
else { // 바라보는 방향의 앞칸이 청소가 되지 않은 빈칸이 아님 다른 방향을 찾으러 1번부터
move(yy, xx, dir);
}
}
else { // 청소되지 않은 빈칸이 없는 경우
// int back = (dir + 2) % 4; // 후진
int back = (dir + 2) % 4;
int ny = yy + dy[back], nx = xx + dx[back];
if (isRoom(ny, nx)) {
if (room[ny][nx] != 1) { //벽이 아니면 이동
move(ny,nx, dir);
}
else { // 이동 불가인 경우 종료
return;
}
}
else return; // 방 밖의 인덱스인 경우 종료
}
}
int main() {
cin >> N >> M; // 방 크기 입력
cin >> y >> x >> d; // 시작 청소기 위치
room.resize(N);
for (int i = 0;i < N;i++) { // 방 구조물 입력
for (int k = 0;k < M;k++) {
int a;
cin >> a;
room[i].push_back(a);
}
}
move(y, x, d);
cout << cnt;
return 0;
}