본문 바로가기
BaekJoon/C++

1743 : 음식물 피하기 (C++)

by GrayChoi 2021. 2. 4.
반응형

 

1743번: 음식물 피하기

첫째 줄에 통로의 세로 길이 N(1 ≤ N ≤ 100)과 가로 길이 M(1 ≤ M ≤ 100) 그리고 음식물 쓰레기의 개수 K(1 ≤ K ≤ 10,000)이 주어진다.  그리고 다음 K개의 줄에 음식물이 떨어진 좌표 (r, c)가 주어진

www.acmicpc.net


먼저 음식물이 떨어진 좌표값들을 입력 받은 후

DFS를 실행한다.

#include<iostream>

using namespace std;

#define MAX_VALUE 101

int N, M, K;
int map[MAX_VALUE][MAX_VALUE];
bool visit[MAX_VALUE][MAX_VALUE];
int cnt = 0;
int result = 0;

int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};

void dfs(int x, int y) {
    cnt++;
    visit[x][y] = true;
    for(int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if(nx <= 0 || nx > N || ny <= 0 || ny > M) {
            continue;
        }
        if(visit[nx][ny] == false && map[nx][ny] == 1) {
            dfs(nx, ny);
        }
    }
}

int main() {
    cin >> N >> M >> K;

    for(int i = 0; i < K; i++) {
        int u, v;
        cin >> u >> v;

        map[u][v] = 1;
    }

    for(int i = 1; i <= N; i++) {
        for(int j = 1; j <= M; j++) {
            if(map[i][j] == 1 && visit[i][j] == false) {
                cnt = 0;
                dfs(i, j);
                result = cnt > result ? cnt : result;
            }
        }
    }
    printf("%d\n", result);
    
    return 0;
}

 

두번째 방법은 BFS를 사용한 방식

#include<iostream>
#include<queue>
#include<vector>

using namespace std;

#define MAX_VALUE 101

int N, M, K;
int map[MAX_VALUE][MAX_VALUE];
bool visit[MAX_VALUE][MAX_VALUE];
int cnt = 0;
int result = 0;

int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};

void bfs(int x, int y) {
    queue<pair<int, int>> q;
    q.push({x, y});
    visit[x][y] = true;

    cnt = 1;

    while(!q.empty()) {
        x = q.front().first;
        y = q.front().second;
        q.pop();
        for(int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(nx <= 0 || nx > N || ny <= 0 || ny > M)
                continue;
            if(visit[nx][ny] == false && map[nx][ny] == 1) {
                visit[nx][ny] = true;
                cnt++;
                q.push({nx, ny});
            }
        }
    }
}

int main() {
    cin >> N >> M >> K;

    for(int i = 0; i < K; i++) {
        int u, v;
        cin >> u >> v;

        map[u][v] = 1;
    }

    for(int i = 1; i <= N; i++) {
        for(int j = 1; j <= M; j++) {
            if(map[i][j] == 1 && visit[i][j] == false) {
                cnt = 0;
                bfs(i, j);
                result = cnt > result ? cnt : result;
            }
        }
    }
    printf("%d\n", result);
    return 0;
}

아직 BFS가 많이 헷갈리는데 BFS를 사용한 방식을 연습해야 할듯.

반응형

'BaekJoon > C++' 카테고리의 다른 글

1009 : 분산처리 (C++)  (0) 2021.02.04
10808 : 알파벳 개수 (C++)  (0) 2021.02.04
2606 : 바이러스 (C++)  (0) 2021.02.03
1260 : DFS와 BFS (C++)  (0) 2021.02.03
2167 : 2차원 배열의 합 (C++)  (0) 2021.02.03

댓글