시뮬레이션 문제입니다.
순서에 맞게 문제를 해결해나가면 됩니다.
1. 현재 위치 청소
2. 보고 있는 방향의 왼쪽 탐색
3. 더러울 시 그 위치로 이동 (방향은 유지) => 1번으로 이동
4. 깨끗하거나 벽일 경우 => 2번으로 이동
5. 4방면이 전부 깨끗하거나 벽일 경우 현재 보고 있는 방향의 뒤로 후진 (방향은 그대로) => 1번으로 이동
6. 후진의 경우 후진할 위치가 벽일 경우 => 종료
위의 방식으로 재귀함수를 만들어주었습니다.
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int map[60][60];
int c = 0;
void move(int a, int b, int d)
{
for (int i = 0; i < 4; ++i) {
int curDir = (d + 7 - i) % 4;
int curX = b;
int curY = a;
switch (curDir) {
case 0:
curY -= 1;
break;
case 1:
curX += 1;
break;
case 2:
curY += 1;
break;
case 3:
curX -= 1;
break;
}
if (map[curY][curX] == 0) {
map[curY][curX] = 2;
++c;
move(curY, curX, curDir);
return;
}
}
switch (d) {
case 0:
a += 1;
break;
case 1:
b -= 1;
break;
case 2:
a -= 1;
break;
case 3:
b += 1;
break;
}
if (map[a][b] != 1) {
move(a, b, d);
}
}
int main(int argc, char *argv[])
{
int n, m;
int startX, startY;
int direction;
cin >> n >> m;
cin >> startY >> startX >> direction;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> map[i][j];
}
}
map[startY][startX] = 2;
move(startY, startX, direction);
cout << c + 1 << endl;
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 16431번 베시와 데이지 (0) | 2019.10.27 |
---|---|
[C++] 백준 16430번 제리와 톰 (0) | 2019.10.27 |
[C++] 백준 10569번 다면체 (0) | 2019.10.25 |
[C++] 백준 1652번 누울 자리를 찾아라 (0) | 2019.10.24 |
[C++] 백준 1357번 뒤집힌 덧셈 (0) | 2019.10.24 |