https://www.acmicpc.net/problem/14503
import java.io.*;
import java.util.*;
public class Main {
static int N,M;
static int r,c,d;
static int answer;
static int[][] map;
static int[] dx = {-1,0,1,0}; //북, 동, 남, 서
static int[] dy = {0,1,0,-1};
static void start(int x, int y, int d){
if(map[x][y]==1) return;
else if(map[x][y]==0){
map[x][y]=2;
answer++;
}
for(int i=0;i<4;i++){
d = (d+3) % 4; //반시계 방향으로 탐색해야한다
int nx = x + dx[d];
int ny = y + dy[d];
//이미 청소 했거나 벽일 경우
if(map[nx][ny]>0) continue;
start(nx,ny,d);
return;
}
//네 방향 다 돌아보고 나서 바라보는 방향 유지한 채 한칸 후진 후 다시 탐색 시작
start(x-dx[d], y-dy[d],d);
}
// static boolean isWall(int x, int y){
// if(x<=0||x>=N-1||y<=0||y>=M-1) return true;
// return false;
// }
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
r = Integer.parseInt(st.nextToken());
c = Integer.parseInt(st.nextToken());
d = Integer.parseInt(st.nextToken());
answer = 0;
map = new int[N][M];
for(int i=0;i<N;i++){
st = new StringTokenizer(br.readLine());
for(int j=0;j<M;j++){
map[i][j] = Integer.parseInt(st.nextToken());
}
}
start(r, c, d);
System.out.println(answer);
}
}
청소기가 청소를 한 곳을 다시 못간다고 생각해서 map을 boolean으로, 방문하면 다 벽을 만들어버렸는데 청소를 한 곳도 방문할 수 있었다. 방향을 바꾸는 부분이 헷갈려서 오래 걸렸다.
정답을 맞추긴 했지만 여전히 헷갈리기는 한다.
'알고리즘' 카테고리의 다른 글
[BOJ] 15663번 : N과 M (9) (JAVA) (0) | 2023.02.03 |
---|---|
[Softeer] 장애물 인식 프로그램 (JAVA) (0) | 2023.02.02 |
[BOJ] 9205번: 맥주 마시면서 걸어가기 (JAVA) (0) | 2023.01.27 |
[BOJ] 1260번 : DFS와 BFS (JAVA) (0) | 2023.01.26 |
[BOJ] 1697번 : 숨바꼭질 (JAVA) (0) | 2023.01.25 |