Search
Duplicate

치즈

주차
0
문제번호
2636
언어
C++
티어
골드
유형
구현
그래프
BFS
시뮬레이션
nj_Blog
nj_상태
완료
이해도
풀이
사람
이해도 2
13 more properties

Memo

공기에 노출된다는 것에만 초점을 맞춰 봤습니다.
0, 0 부터 BFS를 통해 공기에 접촉하는 치즈를 지워나갈 수 있습니다.

Code

제출 날짜

@3/28/2021

메모리

2036 KB

시간

0 ms
#include <iostream> #include <cstring> #include <queue> #define endl "\n" int N, M; bool g_map[102][102]; bool visited[102][102]; int save, ans; std::queue<std::pair<int, int> >q; int dx[4] = {0, 0, -1, 1}; int dy[4] = {1, -1, 0, 0}; void input_faster() { std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); } void input() { input_faster(); std::cin >> N >> M; for (int i = 0 ; i < N ; i++) for (int j = 0 ; j < M ; j++) std::cin >> g_map[i][j]; ans = 0; } int count_map() { int cnt = 0; for (int i = 1 ; i <= N ; i++) for (int j = 1 ; j <= M ; j++) cnt += g_map[i][j]; return (cnt); } void bfs() { int y, x, ny, nx; q.push({0, 0}); visited[0][0] = 1; while(!q.empty()) { y = q.front().first; x = q.front().second; q.pop(); for (int i = 0 ; i < 4 ; i++) { ny = y + dy[i]; nx = x + dx[i]; if (ny < 0 || ny > N + 1 || nx < 0 || nx > M + 1 || visited[ny][nx]) continue; visited[ny][nx] = 1; if (g_map[ny][nx] == 1) { g_map[ny][nx] = 0; continue; } q.push({ny, nx}); } } } void solve() { int tmp; save = 0; ans = 0; while ((tmp = count_map())) { save = tmp; std::memset(visited, 0, sizeof(visited)); q = std::queue<std::pair<int, int> >(); bfs(); ans++; } } void print_val() { std::cout << ans << endl; std::cout << save; } int main() { input(); solve(); print_val(); return (0); }
C++
복사