본문 바로가기
알고리즘

백준 s1 1926 그림 c++

by kyj0032 2024. 1. 12.

https://www.acmicpc.net/problem/1926

 

풀이

 

for (모든 좌표 i, j)

  if board가 1이고, vis 방문하지 않았다면

    mx = max(mx, bfs로 나온 그림 크기)

    answer++;

 

실수했던 것

 

그림이 아무 것도 없을 때 max값이 0이 나와야 하는데 습관적으로 max = -1로 두어서 틀렸음

역시 틀린 게 있을 땐 문제를 다시 읽어보는 게 중요

 

/*boj s1 1926 그림*/
#include <iostream>
#include <queue>
#define MAXN 502
using namespace std;

int N, M;
int board[MAXN][MAXN];
int vis[MAXN][MAXN];
int answer = 0;
int mx = 0;

int dx[4] = { -1, 0, 1, 0 };
int dy[4] = { 0, -1, 0, 1 };
int bfs(int x, int y)
{
    queue<pair<int, int>> Q;
    int area = 0;
    vis[x][y] = 1;
    Q.push({ x, y });

    while (!Q.empty()) {
        pair<int, int> cur = Q.front();
        Q.pop();
        area++;

        for (int dir = 0; dir < 4; dir++) {
            int nx = cur.first + dx[dir];
            int ny = cur.second + dy[dir];

            if (nx < 0 || nx >= N || ny < 0 || ny >= M)
                continue;
            if (board[nx][ny] == 0)
                continue;
            if (vis[nx][ny] > 0)
                continue;

            vis[nx][ny] = 1;
            Q.push({ nx, ny });
        }
    }

    return area;
}

int main(void)
{
    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 (board[i][j] == 1 && vis[i][j] == 0) {
                mx = max(mx, bfs(i, j));
                answer++;
            }
        }
    }

    cout << answer << "\n"
         << mx << "\n";
}

'알고리즘' 카테고리의 다른 글

백준 g3 14442 벽 부수고 이동하기 2 c++  (0) 2024.01.12
백준 g4 불 c++  (0) 2024.01.12
백준 g5 5430 AC c++  (0) 2024.01.11
백준 s4 1021 회전하는 큐 c++  (0) 2024.01.11
백준 s4 2164 카드2 c++  (0) 2024.01.10