https://www.acmicpc.net/problem/16932
16932번: 모양 만들기
N×M인 배열에서 모양을 찾으려고 한다. 배열의 각 칸에는 0과 1 중의 하나가 들어있다. 두 칸이 서로 변을 공유할때, 두 칸을 인접하다고 한다. 1이 들어 있는 인접한 칸끼리 연결했을 때, 각각의
www.acmicpc.net
[난이도] Gold4
[유형] DFS
[풀이]
DFS로 구한 각 컴포넌트에 id를 기록하고 몇개의 점을 포함하는지를 배열에 기록해놓는다.
그 뒤 0인 모든 점을 확인하면서 4방향에 있는 id들의 개수를 더해준 값을 구해준다.
#include <cstdio>
#include <set>
#include <algorithm>
using namespace std;
int N,M,map[1000][1000],cnt[1000001];
int dy[4]={-1,1,0,0},dx[4]={0,0,1,-1};
bool visit[1000][1000];
int dfs(int y,int x,int k){
visit[y][x]=1;
map[y][x]=k;
int ret=1;
for(int i=0;i<4;i++){
int ny=y+dy[i],nx=x+dx[i];
if(ny<0||nx<0||ny>=N||nx>=M||!map[ny][nx]||visit[ny][nx]) continue;
ret+=dfs(ny,nx,k);
}
return ret;
}
int main(){
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++)
for(int j=0;j<M;j++) scanf("%d",&map[i][j]);
int id=1;
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
if(!visit[i][j] && map[i][j]) {
cnt[id]=dfs(i,j,id);
id++;
}
int ans=0;
for(int y=0;y<N;y++){
for(int x=0;x<M;x++){
if(map[y][x]) continue;
int c=0;
set<int> s;
for(int i=0;i<4;i++){
int ny=y+dy[i],nx=x+dx[i];
if(ny<0||nx<0||ny>=N||nx>=M||!map[ny][nx]) continue;
s.insert(map[ny][nx]);
}
for(auto k : s) c+=cnt[k];
ans=max(c,ans);
}
}
printf("%d",ans+1);
}
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold4/16932.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold4] 3671 : 산업 스파이의 편지 (C++) (0) | 2021.01.31 |
---|---|
[BOJ/백준][Gold4] 18119 : 단어 암기 (C++) (0) | 2021.01.31 |
[BOJ/백준][Gold4] 8981 : 입력숫자 (C++) (0) | 2021.01.31 |
[BOJ/백준][Gold4] 1577 : 도로의 개수 (C++) (0) | 2021.01.31 |
[BOJ/백준][Gold4] 1153 : 네 개의 소수 (C++) (0) | 2021.01.31 |