https://www.acmicpc.net/problem/3184
문제
미키의 뒷마당에는 특정 수의 양이 있다. 그가 푹 잠든 사이에 배고픈 늑대는 마당에 들어와 양을 공격했다.
마당은 행과 열로 이루어진 직사각형 모양이다. 글자 '.' (점)은 빈 필드를 의미하며, 글자 '#'는 울타리를, 'o'는 양, 'v'는 늑대를 의미한다.
한 칸에서 수평, 수직만으로 이동하며 울타리를 지나지 않고 다른 칸으로 이동할 수 있다면, 두 칸은 같은 영역 안에 속해 있다고 한다. 마당에서 "탈출"할 수 있는 칸은 어떤 영역에도 속하지 않는다고 간주한다.
다행히 우리의 양은 늑대에게 싸움을 걸 수 있고 영역 안의 양의 수가 늑대의 수보다 많다면 이기게 된다. 그렇지 않다면 늑대가 그 지역 안의 모든 양을 먹는다.
맨 처음 모든 양과 늑대는 마당 안 영역에 존재한다.
아침이 도달했을 때 살아남은 양과 늑대의 수를 출력하는 프로그램을 작성하라.
입력
첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다.
다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.
출력
하나의 줄에 아침까지 살아있는 양과 늑대의 수를 의미하는 두 정수를 출력한다.
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 | #include <iostream> #include <queue> #include <cstring> using namespace std; char arr[251][251]; int dp[251][251]; int dx[4] = { -1,0,1,0 }; int dy[4] = { 0,-1,0,1 }; int sheep, wolf; int R, C; queue <pair<int, int>> q; void BFS(int x,int y) { int cur_sheep, cur_wolf; cur_sheep = cur_wolf = 0; dp[x][y] = 1; q.push(make_pair(x, y)); if (arr[x][y] == 'o') cur_sheep++; else if (arr[x][y] == 'v') cur_wolf++; while (!q.empty()) { int curX, curY; curX = q.front().first; curY = q.front().second; q.pop(); int i; for (i = 0; i < 4; i++) { int next_X = curX+ dx[i]; int next_Y = curY + dy[i]; if (next_X < 0 || next_X >= R || next_Y<0 || next_Y>=C||arr[next_X][next_Y]=='#'||dp[next_X][next_Y]==1) { continue; } else { dp[next_X][next_Y] = 1; if (arr[next_X][next_Y] == 'o') cur_sheep++; else if (arr[next_X][next_Y] == 'v') cur_wolf++; q.push(make_pair(next_X, next_Y)); } } } if (cur_sheep > cur_wolf) wolf -= cur_wolf; else sheep -= cur_sheep; } int main() { int i, j; scanf("%d %d", &R, &C); getchar(); sheep = wolf = 0; for (i = 0; i <R; i++) { for (j = 0; j <C; j++) { scanf("%c", &arr[i][j]); if (arr[i][j] == 'o') sheep++; else if (arr[i][j] == 'v') wolf++; } getchar(); } for (i = 0; i < R; i++) { for (j = 0; j < C; j++) { if ((arr[i][j] == 'o' || arr[i][j] == 'v') && dp[i][j] == 0) { BFS(i, j); } } } printf("%d %d", sheep, wolf); } | cs |
'백준 알고리즘' 카테고리의 다른 글
[C++] 백준알고리즘 BFS 10026번 적록색약 문제 (0) | 2019.05.19 |
---|---|
[C언어] 백준알고리즘 1965번 상자넣기 (0) | 2019.05.19 |
[C언어] 백준알고리즘 9372번 상근이의 여행 (0) | 2019.05.19 |
[C언어] 백준알고리즘 2631번 줄세우기 문제 (0) | 2019.05.19 |
[C언어] 백준알고리즘 11053번 가장 긴 증가하는 부분 수열 문제 (0) | 2019.05.15 |