Algorithm/Problem Solve

[백준 1012] 유기농 배추 ( BFS )

아네스 2020. 12. 15. 19:03
반응형

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";

    }
}
반응형