반응형
BFS문제.
row, col 바뀌어서 input 주어지니 유의
#include <bits/stdc++.h>
using namespace std;
queue<pair<int,int>> q;
int T,M,N,K;
int cnt=0;
int board[51][51];
bool visited[51][51];
int dx[4] = {0,1,0,-1}; // 상, 우, 하, 좌
int dy[4] = {-1,0,1,0};
void bfs(int row, int col){
visited[row][col] = 1; // 시작지점 방문 표시.
q.push({row,col});
while(!q.empty())
{
int r = q.front().first;
int c = q.front().second;
q.pop();
for(int i = 0; i< 4; i++) // 시계방향 탐색
{
int nr = r+dx[i]; // 새로운 곳 nr, nc
int nc = c + dy[i];
if(nr <0 || nr >N-1 || nc <0 || nc> M-1) continue; // board벗어나면 무시
if(visited[nr][nc] ==1 || board[nr][nc] ==0) continue; // 방문했거나, 배추 없는곳이라면 무시
visited[nr][nc] = 1;
q.push({nr,nc});
}
}
cnt ++; //인접지역 1개끝나면 지렁이 1마리 추가
return;
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> T;
for(int k = 0; k< T; k++)
{
cin >> M>>N>>K;
memset(board, false, sizeof(board)); // 매번 board가 바뀌므로 초기화
for(int j = 0; j<K; j++)
{
int col, row;
cin >> col >> row;
board[row][col]=1;
}
cnt =0;
memset(visited, false, sizeof(visited)); // 매번 visited 초기화
for(int i = 0; i< N; i++)
{
for(int j = 0 ; j<M; j++)
{
if(board[i][j] ==1 && visited[i][j] ==0){ //1인곳 찾아서 들어갈건데, 안들어간 곳만.
bfs(i, j);
}
}
}
cout << cnt << "\n";
}
}
반응형
'Algorithm > Problem Solve' 카테고리의 다른 글
[백준 1463번] 1로 만들기 (0) | 2020.12.21 |
---|---|
[백준 1074번] Z ( 분할정복, 재귀) ** 다시풀어보기** (0) | 2020.12.19 |
[백준 1003] 피보나치 함수 (DP문제) (0) | 2020.12.15 |
[백준 1929] 소수 구하기(DP문제) (0) | 2020.12.14 |
[백준 10866번] 덱 (0) | 2020.12.14 |