코테연습일지/그래프 이론
1245 농장 관리
jemin0619
2024. 3. 4. 17:01
https://www.acmicpc.net/problem/1245
1245번: 농장 관리
첫째 줄에 정수 N(1 < N ≤ 100), M(1 < M ≤ 70)이 주어진다. 둘째 줄부터 N+1번째 줄까지 각 줄마다 격자의 높이를 의미하는 M개의 정수가 입력된다. 격자의 높이는 500보다 작거나 같은 음이 아닌 정수
www.acmicpc.net
처음 문제를 볼 때는 풀이를 생각하지 못했는데 정해를 보니 대단했다...
주변에 자신보다 높은 칸이 있다면 false로 바꿔서 ans++을 하지 못하게 한다.
그리고 제일 중요한 점은 자기 자신과 크기가 같은 칸만을 탐색한다는 점이다.
처음에 이를 모르고 풀어서 고생했다.
#include <bits/stdc++.h>
using namespace std;
int n,m,ans;
int board[103][73];
bool vis[103][73];
int dx[8]={1,1,0,-1,-1,-1,0,1};
int dy[8]={0,1,1,1,0,-1,-1,-1};
bool isPeak=true;
void BFS(int y, int x){
queue<pair<int,int>> Q;
Q.push({y,x}); vis[y][x]=true;
while(!Q.empty()){
auto cur=Q.front(); Q.pop();
for(int dir=0;dir<8;dir++){
int ny=cur.first+dy[dir];
int nx=cur.second+dx[dir];
if(ny<0||nx<0||ny>=n||nx>=m) continue;
if(board[ny][nx]>board[cur.first][cur.second]) isPeak=false;
if(vis[ny][nx]||board[ny][nx]!=board[cur.first][cur.second]) continue;
Q.push({ny,nx}); vis[ny][nx]=true;
}
}
}
int main(){
ios::sync_with_stdio(0); cin.tie(0);
cin>>n>>m;
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(vis[i][j]) continue;
isPeak=true;
BFS(i,j);
if(isPeak) ans++;
}
}
cout<<ans;
return 0;
}