[백준/C++] 1926번 그림
2021. 3. 24. 17:02ㆍ알고리즘/BFS DFS
728x90
반응형
문제: www.acmicpc.net/problem/1926
1926번: 그림
어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로
www.acmicpc.net
문제풀이
BFS 알고리즘으로 문제를 풀었다.
코드
#include <iostream>
#include <queue>
using namespace std;
int main(){
ios::sync_with_stdio(false); cin.tie(nullptr);
int n, m;
cin>>n>>m;
int visited[500][500] = {0,};
int board[500][500];
int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
int area, cnt = 0, maxArea = 0;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cin>>board[i][j];
}
}
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(visited[i][j] || board[i][j] == 0) continue;
cnt++; //새로운 그림을 만났으므로 cnt++
area = 0; //그림 크기 초기화
queue<pair<int, int>> q;
visited[i][j] = 1;
q.push({i,j});
while(!q.empty()){
area++; //큐가 지속된다면 그림이 연결되어있다는 뜻으로 그림 크기 증가
pair<int, int> cur = q.front();
q.pop();
for(int dir=0; dir<4; dir++){
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if(nx < 0 || ny < 0 || nx >= n || ny >= m) continue;
if(board[nx][ny] == 0 || visited[nx][ny]) continue;
visited[nx][ny] = 1;
q.push({nx,ny});
}
}
if(maxArea < area) //최대 그림 크기 저장
maxArea = area;
}
}
cout<<cnt<<"\n"<<maxArea;
return 0;
}
결과

728x90
반응형
'알고리즘 > BFS DFS' 카테고리의 다른 글
[백준/C++] 4179번 불! (0) | 2021.03.26 |
---|---|
[백준/C++] 1697번 숨바꼭질 (0) | 2021.03.26 |
[백준/C++] 7576번 토마토 (0) | 2021.03.25 |
[백준/C++] 2178번 미로 탐색 (0) | 2021.03.25 |
[백준/C++] 11724번 연결 요소의 개수 (0) | 2021.02.25 |