공부방

dfs로봇 청소기(4방 탐색) 본문

문법/알고리즘

dfs로봇 청소기(4방 탐색)

코딩 화이팅 2023. 6. 4. 21:58

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$  둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽

www.acmicpc.net

package 방학1주차;

import java.util.Scanner;

public class 로봇청소기_14503 {
	static int N,M,count;
	static int[][] map;
	//북,동,남,서
	static int[] dy= {-1,0,1,0};
	static int[] dx= {0,1,0,-1};
	
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		N=sc.nextInt();
		M=sc.nextInt();
		
		//현재 로봇 청소기의 위치
		int cy=sc.nextInt();
		int cx=sc.nextInt();
		int cd=sc.nextInt();
		
		map=new int[N][M];
		for (int y = 0; y < N; y++) {
			for (int x = 0; x < M; x++) {
				map[y][x]=sc.nextInt();
			}
		}
		count=1;//청소 안 한 곳에 위치한댔으니
		dfs(cy,cx,cd);
		System.out.println(count);
	}

	private static void dfs(int cy, int cx, int cd) {
		map[cy][cx]=-1;//청소를 했다고 표시한 거는 -1로 표시
		for (int i = 0; i < 4; i++) {
			//중요!
			//방향을 원래 보던 곳에서 왼쪽으로 돌리기 위해 맨 위에 dy,dx를 북동남서로 정했으니
			//3을 더하고 4로 나눈 나머지는 왼쪽 방향으로 돌리게 된다.
			cd=(cd+3)%4;
			//그 돌린 방향으로 새로운 좌표를 만들고
			int ny=cy+dy[cd];
			int nx=cx+dx[cd];
			//그 좌표가 벽 안 쪽에 있어서 그 안쪽이었던 곳이 0으로 청소가 안 됐을 곳일 때
			if (ny>=0&&nx>=0&&ny<N&&nx<M&&map[ny][nx]==0) {
				count++;//하나를 더해 청소를 해준 곳으로 표시를 해주고
				dfs(ny,nx,cd);//다시 그 곳에서 dfs를 돌려준다.
				//return부분 다시 생각해보기
				return;//이 return이 있어야 멈춘 곳에서 다시 탐색을 해 새로운 청소할 곳을 찾을 수 있다.
			}
		}
		//4방향이 다 청소가 됐을 때
		//뒤로 갈 때
		int back=(cd+2)%4;//뒤로 도는 것은 +2를 해주고 4로 나눠주면 뒤로 돌 수 있다.
		//새로운 뒤로 도는 좌표들을 만들고
		int by=cy+dy[back];
		int bx=cx+dx[back];
		//범위 안에 들어있고 돌았을 때 벽이 아니라면
		if (by>=0&&bx>=0&&by<N&&bx<M&&map[by][bx]!=1) {
			//다시 dfs를 돌린다.방향과 같이 가는 것이 아니기 때문에 back으로 주면 안되고 cd로 온 방향대로 가기 때문에 줘야된다.
			dfs(by,bx,cd);
		}
	}
}

4방 탐색에서 왼쪽으로 돌 때, 뒤로 돌 때, dfs안에 두 가지의 경우가 있을 때(청소할 곳이 있을 때, 없을 때)return을 사용하는 것.

'문법 > 알고리즘' 카테고리의 다른 글

Math.pow  (0) 2023.09.02
HashSet  (0) 2023.06.12
dp-파스칼의 삼각형  (0) 2023.05.09
그리디/2차배열 정렬/회의실 배정  (0) 2023.04.27
bfs문제(토마토)  (0) 2023.04.15