# 유형 : 시뮬레이션, 재귀

# 조건을 잘 확인하면서 구현하면 어렵지 않은 문제. 재귀 함수를 통해 탐색을 이어나가면서 만약 더이상 탐색을 할 곳이 없을때 뒤로 빠지는 것 까지 잘 생각하고 구현해주면 된다. 이 때 벽이 있는 예외처리를 잘 해줘야함.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package bj;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class p14503 {
    static int N,M,r,c,d;
    static int arr[][];
    static int rs=1;
    static int moveX[] = {0,1,0,-1};
    static int moveY[] = {-1,0,1,0};
    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());
        arr = new int[N][M];
        
        st = new StringTokenizer(br.readLine());
        r = Integer.parseInt(st.nextToken());
        c = Integer.parseInt(st.nextToken());
        d = Integer.parseInt(st.nextToken());
        
        
        for(int i=0; i<N; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<M; j++) {
                int val = Integer.parseInt(st.nextToken());
                if(val == 1)
                    val=-1;
                arr[i][j] = val;
            }
        }
        clean(r,c,d);
        System.out.println(rs);
    }
    
    public static void clean(int i, int j, int dir) {
        arr[i][j] = 1;
        
        for(int d=0; d<4; d++) {
            dir = (dir+3)%4;
            int newX = j + moveX[dir];
            int newY = i + moveY[dir];
            
            if(0<=newX && newX<&& 0<=newY && newY<&& arr[newY][newX]==0) {
                rs++;
                clean(newY, newX, dir);
                return;
            }
        }
        
        int back = (dir+2)%4;
        int backX = j + moveX[back];
        int backY = i + moveY[back];
        
        if(0<=backX && backX<&& 0<=backY && backY<&& arr[backY][backX]!=-1)
            clean(backY,backX,dir);
    }
    
}
 
cs

+ Recent posts