문제링크 : https://www.acmicpc.net/problem/21736
21736번: 헌내기는 친구가 필요해
2020년에 입학한 헌내기 도연이가 있다. 도연이는 비대면 수업 때문에 학교에 가지 못해 학교에 아는 친구가 없었다. 드디어 대면 수업을 하게 된 도연이는 어서 캠퍼스 내의 사람들과 친해지고
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>
int N, M, cnt = 0;
char arr[601][601];
bool visited[601][601];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
void bfs(int a, int b)
{
visited[a][b] = 1;
queue<pii>q;
q.push({a, b});
while(!q.empty())
{
int yy = q.front().first;
int xx = q.front().second;
q.pop();
for(int i=0; i<4; i++)
{
int nx = xx + dx[i];
int ny = yy + dy[i];
if(nx < 0 || ny < 0 || nx >= M || ny>=N) continue; //범위 조건
if(arr[ny][nx]=='X' || visited[ny][nx]==1) continue; //벽이거나 이미 방문했으면 패스
if(arr[ny][nx]=='P') cnt++; //사람이다!
visited[ny][nx]=1;
q.push({ny, nx});
}
}
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N >> M;
for(int i=0; i<N; i++)
{
for(int j=0; j<M; j++)
{
cin >> arr[i][j];
}
}
for(int i=0; i<N; i++)
{
for(int j=0; j<M; j++)
{
if(arr[i][j]=='I')
{
bfs(i,j); //I 일때 탐색 시작
}
}
}
if(cnt==0) cout << "TT";
else cout << cnt;
return 0;
}
흔한 bfs 문제다.
먼저 배열을 다 입력받은 후에 다시 I (도연이) 일때 bfs 탐색을 돌린다.
상하좌우로 탐색하되, 다음 지점이 X (벽) 이거나, 이미 방문했다면 넘긴다.
P일 때는 사람을 만난 것이기에 카운트를 한다.
'백준 > 실버' 카테고리의 다른 글
[백준 10610번] 30 (C++) (0) | 2023.04.11 |
---|---|
[백준 10025번] 게으른 백곰 (C++) (0) | 2023.04.08 |
[백준 2512번] 예산 (C++) (0) | 2023.04.06 |
[백준 22351번] 수학은 체육과목 입니다 3 (C++) (0) | 2023.04.05 |
[백준 17419번] 비트가 넘쳐흘러 (C++) (0) | 2023.04.04 |