티스토리 뷰
출처 : https://www.acmicpc.net/problem/3187
"BFS 탐색"
해당 문제는 울타리로 나눠진 구역 안에 양과 늑대에 수에 따라 늑대가 죽는지 양이 죽는지 판별하는 문제로 단지영역나누기 와 비슷한 문제이다. 따라서 BFS 탐색으로 울타리가 아닌 지점을 모두 탐색하여 영역 내 양과 늑대의 수를 파악하고, 그 결과에 따라 양 > 늑대 이면 늑대를 죽이고, 양 <= 늑대 이면 양을 죽인다.
방문한 곳을 또 방문하면 안되므로 visited 배열을 사용했음을 확인한다.
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 83 84 85 86 87 88 89 90 91 92 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Main { static int R,C; static char[][]map; static boolean[][] visited; static int[] dx = {0,0,1,-1}; static int[] dy = {1,-1,0,0}; static int sheep; static int wolf; static Queue<Node> q = new LinkedList<>(); public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); R = Integer.parseInt(st.nextToken()); C = Integer.parseInt(st.nextToken()); map = new char[R][C]; visited = new boolean[R][C]; for (int i = 0; i < R; i++) { map[i] = br.readLine().toCharArray(); } for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { if(map[i][j] == '#' || visited[i][j]) continue; solve(i,j); } } System.out.println(sheep+" "+wolf); } static void solve(int x, int y) { int v = 0; int k = 0; visited[x][y] = true; q.add(new Node(x, y)); while(!q.isEmpty()) { Node cur = q.poll(); if(map[cur.x][cur.y] == 'v') v++; if(map[cur.x][cur.y] == 'k') k++; for (int i = 0; i < 4; i++) { int nx = cur.x + dx[i]; int ny = cur.y + dy[i]; if(!isRange(nx, ny) || visited[nx][ny] || map[nx][ny] == '#') continue; visited[nx][ny] = true; q.add(new Node(nx, ny)); } } if(v >= k) { wolf += v; } else { sheep +=k; } } static boolean isRange( int x, int y) { if( x < 0 || x>= R || y <0 || y >=C) return false; return true; } } class Node { int x; int y; Node(int x,int y) { this.x = x; this.y = y; } } | cs |
'Study > 알고리즘 문제풀이' 카테고리의 다른 글
SWEA 5644. [모의 SW 역량테스트] 무선 충전 :: 돼지개발자 (0) | 2018.11.06 |
---|---|
백준 1953. 팀배분 :: 돼지개발자 (0) | 2018.11.06 |
백준 1613. 역사 :: 돼지개발자 (0) | 2018.11.05 |
백준 5566. 주사위 게임 :: 돼지개발자 (0) | 2018.11.05 |
백준 3048. 개미 :: 돼지개발자 (0) | 2018.11.05 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday