본문 바로가기
알고리즘

[알고리즘] c++ cpp 양치기 꿍

by keel_im 2020. 12. 4.
반응형

포인트

1. BFS (너비 우선 탐색)을 구현하는 문제입니다
한 구역에 탐색을 BFS로 진행을 합니다. 구역 탐색을 마치고 양의 숫자와 늑대의 숫자를 비교해서 
한 친구(양이나 늑대)를 0으로 만들어준 후 결과 값에 더해줍니다.

🧶문서는 항상 수정될 수 있습니다. 비판은 환영합니다. 

#include <iostream>
#include <queue>
#include <tuple>

using namespace std;

int n, m;
char map[255][255];
bool visited[255][255];

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

pair<int, int> bfs(int a, int b){
    queue<pair<int, int>> q;
    q.push({a, b});
    visited[a][b] = 1;

    int c = 0;
    int d = 0;

    while(!q.empty()){
        int x, y;
        tie(x, y) = q.front();
        q.pop();

        for(int i=0; i<4;i++){
            int nx = x+dx[i];
            int ny = y+dy[i];

            if(nx<0||ny<0||nx>=n||ny>=m) continue;

            if(!visited[nx][ny]&&map[nx][ny]!='#') {
                if(map[nx][ny]=='v') d+=1;
                else if(map[nx][ny]=='k') c+=1;

                q.push({nx, ny});
                visited[nx][ny] = 1;
            }
        }
    }

    if(c>d) d=0;
    else c=0;

    return {c, d};
}

int main(){
    cin>>n>>m;

    for(int i=0; i<n; i++){
        string s;
        cin>>s;

        for(int j=0; j<m; j++) map[i][j] = s[j];
    }

    pair<int, int> answer = {0,0};
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            pair<int, int> a = bfs(i, j);
            answer = {answer.first+a.first, answer.second+a.second};
        }
    }

    cout<<answer.first<<" "<<answer.second<<"\n";
}

 

반응형

댓글