본문 바로가기
알고리즘/백준

[백준] 14503 로봇 청소기 C++

by 오오오니 2022. 12. 29.

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