3184번 - 양
해당 영역마다 BFS를 이용해서 문제를 풀 수 있었다. 처음에 탈출하는 영역 예외 처리를 해줘야 한다고 생각했는데, 문제를 읽어보니 양과 늑
대는 모두 영역 안에 존재한다는 조건때문에 그냥 각 영역에서 BFS를 실행하면 되는 문제였다.
각 영역에서 BFS를 실행하여, 해당 영역의 양의 수와 늑대의 수를 구하고, 늑대가 많거나 같으면 늑대를 최종 늑대 개수에 더해준다. 그 반대
의 경우에는 양의 수를 최종 양의 개수에 더해준다.
<정답 코드>
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 | #include<iostream> #include<queue> using namespace std; int dx[] = { 0,0,1,-1 }; int dy[] = { 1,-1,0,0 }; int N, M; char map[250][250]; bool visited[250][250]; int main() { //freopen("input.txt", "r", stdin); int ans1 = 0; int ans2 = 0; cin >> N >> M; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cin >> map[i][j]; } } for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { // 울타리가 아닌 지점에서 BFS if (map[i][j] != '#' && !visited[i][j]) { queue<pair<int, int>> q; // 해당 영역에서 늑대와 양의 수 체크 변수 int v_num = 0; int o_num = 0; q.push({ i,j }); visited[i][j] = true; while (!q.empty()) { int x = q.front().first; int y = q.front().second; if (map[x][y] == 'o') o_num++; if (map[x][y] == 'v') v_num++; q.pop(); for (int d = 0; d < 4; d++) { int nx = x + dx[d]; int ny = y + dy[d]; if (nx >= 0 && ny >= 0 && nx < N && ny < M && !visited[nx][ny] && map[nx][ny] != '#') { visited[nx][ny] = true; q.push({ nx,ny }); } } } // 해당 영역에 늑대가 많을 경우 if (o_num <= v_num) ans2 += v_num; // 해당 영역에 양이 많을 경우 else ans1 += o_num; } } } cout << ans1 << " " << ans2 << endl; return 0; } | cs |
반응형
'알고리즘 > SW EXPERT' 카테고리의 다른 글
4534. 트리 흑백 색칠 (0) | 2018.10.06 |
---|---|
4583. 세븐 카드 섞기 게임 (0) | 2018.10.06 |
5432. 쇠막대기 자르기 (0) | 2018.10.06 |
5648. 원자 소멸 시뮬레이션 (0) | 2018.10.04 |
5653. 줄기세포배양 (2) | 2018.10.02 |