CS/알고리즘_문제풀이(자바)

알고스팟

Jedy_Kim 2021. 10. 14. 15:57
728x90

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

 

1261번: 알고스팟

첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미

www.acmicpc.net

 

// 코드

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import java.util.*;
import java.io.*;
 
public class Main{ 
  
  static int N, M;
  static int[][] arr;
  static int[][] arrCpy;
  static boolean[][] visited;
  
  // 최종답
  static int cnt = 0;
  // 상, 하, 좌, 우 
  static final int[][] Dir = {{-10}, {10}, {0-1}, {01}};
  
  static boolean bfs() { 
    
    Deque<int[]> deq = new ArrayDeque<>();
    deq.add(new int[]{00});
    
    while(!deq.isEmpty()) {
      int[] pos = deq.pop(); 
      // 목적지에 도달하면 true를 리턴한다.
      if(pos[0== N-1 && pos[1== M-1return true;
      
      for(int i=0; i<4++i) {
        int ny = pos[0+ Dir[i][0];
        int nx = pos[1+ Dir[i][1];
        
        if0 > ny || ny >= N || 0 > nx || nx >= M ) continue;
        
        if(!visited[ny][nx]) {
          if(arr[ny][nx] == 1) arrCpy[ny][nx] = 0;
          else if(arr[ny][nx] == 0) {
            visited[ny][nx] = true;
            deq.add(new int[]{ny, nx});
          }
        }
        
      } 
    }
    
    for(int i=0; i<N; ++i) {
      arr[i] = arrCpy[i].clone();
    }
    
    return false;
  }
   
  // main
  public static void main(String[] args) throws Exception { 
    
    BufferedWriter bw  = new BufferedWriter(new OutputStreamWriter(System.out));
    BufferedReader br  = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    
    M = Integer.parseInt(st.nextToken());
    N = Integer.parseInt(st.nextToken());
    
    arr     = new int[N][M];
    arrCpy  = new int[N][M];
    visited = new boolean[N][M];
    
    for(int i=0; i<N; ++i) {
      arr[i]    = Arrays.stream(br.readLine().split("")).mapToInt(Integer::parseInt).toArray();
      arrCpy[i] = arr[i].clone();
    }  
    
    while(true) {
      if(bfs()) break;  
      visited = new boolean[N][M];
      cnt++
    }    
    
    bw.write(String.valueOf(cnt));
    
    br.close();
    bw.flush();
    bw.close(); 
  } 
}
 
cs

 

반응형

'CS > 알고리즘_문제풀이(자바)' 카테고리의 다른 글

부분수열의 합  (0) 2021.10.14
N과 M (12)  (0) 2021.10.14
웰컴  (0) 2021.10.14
스티커  (0) 2021.10.13
이친수  (0) 2021.10.13