728x90
반응형
목차
https://www.acmicpc.net/problem/2589
문제
문제 구현 방향
다른 bfs문제들과 마찬가지로 초기화 잘 해주고 L인 경우에만 탐색을 해준 뒤 최단 경로들 중에서 가장 큰 값을 출력하면 되는 간단한 문제이다.
코드 구현
#include <iostream>
#include <vector>
#include<queue>
#include <cmath>
#include <algorithm>
using namespace std;
int dx[4] = {0, 0, -1, 1};
int dy[4] = { 1, -1, 0, 0 };
char board[100][100] = { 0 };
int visit[100][100] = { 0 };
vector<int> v; // bfs탐색결과를 넣어주자
int N, M;
int maxd() { //가장 큰 값 출력해주는 함수
int max = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (visit[i][j] > max)
max = visit[i][j];
}
}
return max-1; //visit이 1부터시작했으므로 1빼주어야함
}
int bfs(int start_x, int start_y) { //기존 bfs방식에 거리를 계속 갱신해 주었다.
visit[start_y][start_x] = 1;
queue<pair<int, int>> q;
q.push({ start_x, start_y });
while (!q.empty()) {
int x = q.front().first;
int 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 > M - 1 || ny <0 || ny > N - 1)
continue;
if (visit[ny][nx] || board[ny][nx] == 'W')
continue;
q.push({ nx, ny });
visit[ny][nx] = visit[y][x]+1;
}
}
return maxd();
}
int main() {
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] == 'L') { //L인 경우에만 탐색
memset(visit, 0, sizeof(visit)); //방문 초기화
v.push_back(bfs(j, i));
}
}
}
cout << *max_element(v.begin(), v.end());
}
//5c3
// 5 4 1 2 (5-3)!
반응형
'백준 문제풀이' 카테고리의 다른 글
[백준][bfs] 4179 불! c++ 구현 (0) | 2024.05.12 |
---|---|
[백준][dfs] 16234 인구 이동 c++ 구현 (0) | 2024.05.11 |
[백준][완전 탐색] 15686 치킨 배달 c++구현 (3) | 2024.05.09 |
[백준][문자열] 2870 수학숙제 c++구현 (0) | 2024.05.07 |
[백준][문자열] 9375 패션왕 신해빈 c++구현 (0) | 2024.05.05 |