역시 시험기간에는 생각 없이 PS 하는 순간이 가장 즐겁다
풀이
이차원 bool 배열에 입력으로 들어오는 부분을 true로 바꾸어주고 이후 기본적인 bfs를 사용해 가장 큰 인접한 쓰레기들을 찾는다
+ 풀고 나니 드는 생각인데 vis 배열과 ar 배열을 합쳐서 풀 수 있을 것 같다.
시간 복잡도 : $O(n*m)$
소요 시간 : 3분
아쉬운 점 : class 6 문제 풀다가 어려워서 여기로 도망 왔다
전체적인 감상 : 처음 bfs 구현 연습할 때 풀기 좋은 문제인 것 같다.
/* basic setup {{{ */
#include<bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
#define sz(x) ((int)x.size())
#define all(x) x.begin(),x.end()
#define compress(x) sort(all(x)), x.erase(unique(all(x)), x.end())
#define fast_io ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef const int ci;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
/*}}}*/
ci BN = 101;
bool ar[BN][BN], vis[BN][BN];
int n, m, k, ans, cnt, dx[] = {0, 0, -1, 1}, dy[] = {1, -1, 0, 0};
queue<pii> q;
int main(){
fast_io;
cin>>n>>m>>k;
for(int i=0;i<k;i++){
int a, b;
cin>>a>>b;
ar[a][b] = 1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(!vis[i][j] && ar[i][j]){
q.push({i, j});
vis[i][j] = 1;
cnt = 1;
while(!q.empty()){
pii fr = q.front();
q.pop();
for(int p=0;p<4;p++){
int cx = fr.ff + dx[p], cy = fr.ss + dy[p];
if(!vis[cx][cy] && ar[cx][cy]){
cnt++;
q.push({cx, cy});
vis[cx][cy] = 1;
}
}
}
ans = max(ans, cnt);
}
}
}
cout<<ans;
cout<<'\n';
}
'백준 문제 해설' 카테고리의 다른 글
백준 2083 럭비 클럽 (0) | 2022.10.22 |
---|---|
24262 알고리즘 수업 - 알고리즘의 수행 시간 1 (C++) (0) | 2022.10.14 |
5789 한다 안한다 (C++) (0) | 2022.10.13 |
25191 치킨댄스를 추는 곰곰이를 본 임스 (C++) (0) | 2022.10.12 |
2670 연속부분최대곱 (C++) (1) | 2022.10.10 |
3653 영화 수집 (C++) (0) | 2022.10.09 |
13241 최소공배수 (C++) (0) | 2022.10.08 |
7578 공장 (C++) (0) | 2022.10.07 |