공부방
dfs로봇 청소기(4방 탐색) 본문
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 |