알고리즘 모음(C++)

백준 21736 - 헌내기는 친구가 필요해(C++) 본문

백준

백준 21736 - 헌내기는 친구가 필요해(C++)

공대생의 잡다한 사전 2022. 12. 24. 13:48

문제 링크입니다. https://www.acmicpc.net/problem/21736

 

21736번: 헌내기는 친구가 필요해

2020년에 입학한 헌내기 도연이가 있다. 도연이는 비대면 수업 때문에 학교에 가지 못해 학교에 아는 친구가 없었다. 드디어 대면 수업을 하게 된 도연이는 어서 캠퍼스 내의 사람들과 친해지고

www.acmicpc.net

4방향 탐색으로 친구를 찾아주는 문제였습니다.

'I'에서 시작해서 4방향 탐색으로 'P'를 찾는 문제였습니다.

'X'를 제외한 모든 곳을 탐색할 수 있음으로 이를 유의하여 문제를 풀면 됩니다.

 

 

자세한 것은 코드를 참고해주세요.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <cmath>
#define P pair<int,int>
#define F first
#define S second

using namespace std;

int N, M;
char map[601][601];
int check[601][601];
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
P start;

int bfs(){
    int Friend = 0;
    queue<P> q;
    q.push(start);
    check[start.F][start.S] = 1;
    while(!q.empty()){
        int x = q.front().F;
        int y = q.front().S;
        q.pop();
        for(int i = 0; i < 4; i++){
            int xx = x + dx[i];
            int yy = y + dy[i];
            if(xx >= 1 && xx <= N && yy >= 1 && yy <= M){
                if(check[xx][yy] == 0){
                    if(map[xx][yy] == 'P'){
                        check[xx][yy] = 1;
                        q.push({xx,yy});
                        Friend++;
                    }
                    else if(map[xx][yy] == 'O'){
                        check[xx][yy] = 1;
                        q.push({xx,yy});
                    }
                }
            }
        }
    }
    return Friend;
}

void solve(){
    int ans = bfs();
    if(ans == 0) cout << "TT";
    else cout << ans;
}

int main() {
    cin.tie(0);
    cout.tie(0);
    cin >> N >> M;
    for(int i = 1; i <= N; i++){
        for(int j = 1; j <= M; j++){
            cin >> map[i][j];
            if(map[i][j] == 'I') start = {i,j};
        }
    }
    solve();
    return 0;
}

 

 

질문 및 조언은 댓글을 남겨주세요