[BOJ] 14503 : 로봇 청소기
풀이
시뮬레이션
삼성기출 변형문제
로봇 청소기의 움직임을 시뮬레이션 하는 문제인데
2가지 큰실수를 해서 오래걸렸다.
첫번째로 북,동,남,서 방향으로 이동해야되는데 북쪽을 남쪽으로 좌표를 잘못 두고 풀고있었다.
두번째로 첫번째문제의 디버깅을 하다가 움직임을 numbering한다고 좌표를 찍었는데,
첫번쨰 좌표를 ‘1’로 둬서 벽인 ‘1’인 곳과 코드상 충돌이 되서 예외케이스가 발생했다.
저번에도 처음값 중 0이 존재하는 문제에서 memset 0 으로 초기화했다가 디버깅을 오래 한 적이 있었다.
항상 초기좌표와 구분되도록 음수나 2이상의 숫자를 둬야겠다.
(memset : -1로 초기화 한다던지.)
코드
#include <iostream>
#include <queue>
#include <deque>
#include <vector>
#include <cstring>
using namespace std;
int n, m;
//0:빈칸 1:벽 2:청소함
int arr[50][50];
int ans = 0;
int numbering = 2;
//왼쪽으로 돈다
const int dx[] = { -1,0,1,0 };
const int dy[] = { 0,1,0,-1 };
//dir:0,1,2,3 = 북,동,남,서
//북->서->남->동
void go(int x, int y, int dir) {
arr[x][y] = numbering++;
ans++;
int cnt = 0;
while (1) {
//3,4번조건
if (cnt == 4) {
int d = dir - 2;
if (d < 0) {
d += 4;
}
int nx = x + dx[d];
int ny = y + dy[d];
//뒤가 벽인경우
if (arr[nx][ny] == 1) {
break;
}
else {
x = nx;
y = ny;
cnt = 0;
}
}
else {
//왼쪽방향
int d = dir - 1;
if (d < 0)
d = 3;
int nx = x + dx[d];
int ny = y + dy[d];
dir = d;
//2-1 청소하지 않은 공간 존재
if (arr[nx][ny] == 0) {
arr[nx][ny] = numbering++;
ans++;
x = nx;
y = ny;
cnt = 0;
}
//2-2청소할 공간이 없음
else {
cnt++;
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
int r, c, d;
cin >> r >> c >> d;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> arr[i][j];
}
}
go(r, c, d);
cout << ans;
return 0;
}
Written on April 12, 2019