코드와이
[BAEKJOON] 14503. 로봇 청소기 본문
문제링크
14503번: 로봇 청소기
로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어
www.acmicpc.net
package acmicpc.Gold5;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class 로봇_청소기 {
static int n, m, arr[][], ans;
static boolean visited[][];
// 북 서 남 동
static int[] dr = {-1, 0, 1, 0};
static int[] dc = {0, -1, 0, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
arr = new int[n][m];
for(int i = 0 ; i < n ; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 0 ; j < m ; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
visited = new boolean[n][m];
visited[r][c] = true;
arr[r][c] = 2;
ans = 1;
if(d == 1) d = 3;
else if(d == 3) d = 1;
go(r,c,d);
System.out.println(ans);
}
private static void go(int r, int c, int d) {
for(int i = 0 ; i < 4 ; i++) {
int nd = (d + 1 + i) % 4;
int nr = r + dr[nd];
int nc = c + dc[nd];
if(nr < 0 || nc < 0 || nr >= n || nc >= m) continue;
if(arr[nr][nc] == 1 || visited[nr][nc]) continue;
arr[nr][nc] = 2;
visited[nr][nc] = true;
ans++;
go(nr, nc, nd);
return;
}
int nr = r + dr[(d+2) % 4];
int nc = c + dc[(d+2) % 4];
if(nr < 0 || nc < 0 || nr >= n || nc >= m || arr[nr][nc] == 1) return;
go(nr, nc, d);
}
}
'acmicpc' 카테고리의 다른 글
[BAEKJOON] 10026. 적록색약 (0) | 2021.05.10 |
---|---|
[BAEKJOON] 14500. 테트로미노 (0) | 2021.05.09 |
[BAEKJOON] 11054. 가장 긴 바이토닉 부분 수열 (0) | 2021.05.06 |
[BAEKJOON] 11722. 가장 긴 감소하는 부분 수열 (0) | 2021.05.06 |
[BAEKJOON] 1655. 가운데를 말해요 (0) | 2021.05.04 |