https://www.acmicpc.net/problem/14503
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어
www.acmicpc.net
로봇 청소기가 움직이는 규칙은 위와 같다.
문제는 쉬웠는데 y축으로 움직이는 것을 반대로 설정해서 한참 해맸다. y-1하과 y+1을 반대로 했었다.
-새롭게 알게된 것 : exit(0); - 프로그램을 종료하고 싶을 때 사용.
방문했는지를 알기위해 visit이라는 배열을 따로 사용했는데 다른 사람의 코드를 보니까
벽과 빈 칸을 입력받는 배열을 사용하여 방문한 자리는 -1로 바꿔서 풀었다.
또한 나는 왼쪽으로 회전해서 바라보는 방향을 바꾸기 위해서 아래와 같이 배열을 이용하였는데
다른사람은 (d + i) % 4 (i=3부터 1씩 감소) 이렇게 풀었다.
또한 나는 뒤로 후진하는 것을 아래 코드처럼 풀었는데
다른 사람은(d + 2) % 4 이렇게 계산하여 풀었다.
수식을 만들어 내는 것이 신기했다.
#include<iostream>
using namespace std;
int n, m, D, Y, X;//세로,가로,방향,y좌표,x좌표
int arr[51][51];
bool visit[51][51];
int r[4];
int b,rt;
bool check = false;
int ans;//로봇청소기가 출력하는 칸의 개수
int answer;
// d가 0:북쪽, 1:동쪽, 2: 남쪽, 3: 서쪽
int dy[4] = { -1,0,1,0 };
int dx[4] = { 0,1,0,-1 };//바라보는 방향으로 1전진
void move(int y, int x, int d)
{
if (!visit[y][x])
{
ans++;
visit[y][x] = true;
}
for (int i = 0; i < 4; i++)
{
d = r[d];
int ny = y + dy[d];
int nx = x + dx[d];
if (ny < 0 || nx < 0 || ny >= n || nx >= m || arr[ny][nx] == 1)
continue;
if (!arr[ny][nx] && !visit[ny][nx])//빈칸이고 방문한 적이 없다면
{
//청소하지 않은 공간이 존재한다면
//그 방향으로 회전한 다음 한 칸 전진
move(ny, nx, d);
}
}
//네 방향 모두 청소가 이미 되어있거나 벽인 경우에는 방향을 유지하고 후진
if (d == 2 || d == 0)
b = 2 - d;
else
b = 4 - d;
if (!arr[y + dy[b]][x + dx[b]])//후진 한 곳이 벽이 아니라면
{
move(y + dy[b], x + dx[b], d);
}
cout << ans << endl;
exit(0);
}
int main()
{
cin >> n >> m;
cin >> Y >> X >> D;
//왼쪽으로 회전
r[0] = 3;
r[1] = 0;
r[2] = 1;
r[3] = 2;
//후진
for(int i=0;i<n;i++)
for (int j = 0; j < m; j++)
{
cin >> arr[i][j];
}
move(Y, X, D);
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2502 떡 먹는 호랑이 c++ (0) | 2023.01.02 |
---|---|
[백준] 1707 이분 그래프 C++ (0) | 2022.12.29 |
[백준] 6236 용돈 관리 c++ (0) | 2022.09.22 |
[백준] LCS c++ (1) | 2022.09.21 |
[백준] 11052 카드 구매하기 c++ (1) | 2022.09.11 |