[BOJ/C+]#2589宝島
https://www.acmicpc.net/problem/2589
ブルートフォスで起点を見つけるにはタイムアウトが必要だと思っていたが、幸いにも一度通過した.
すべての陸地座標を保存
1つずつ始点として
このとき、
この最大距離値を各始点に求め、その中の最大値を出力すればよい.
ブルートフォスで起点を見つけるにはタイムアウトが必要だと思っていたが、幸いにも一度通過した.
💍 問題を解く
すべての陸地座標を保存
1つずつ始点として
BFS
を回転させ、最短経路をアクセス配列に格納する.(check+保存最短距離にアクセスするかどうか)このとき、
BFS
内でアクセス値を求め、最短経路における最大距離値を更新する(最も遠い始点を探すため)この最大距離値を各始点に求め、その中の最大値を出力すればよい.
💍 コード#コード#
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
#define MAX 50+1
int N,M;
char map[MAX][MAX];
int visited[MAX][MAX];
int dr[4]={-1,0,1,0};
int dc[4]={0,1,0,-1};
vector<pair<int,int>> lands;
int res=-2147000000;
int bfs(int sr, int sc){
int maxVal=0;
memset(visited,0,sizeof(visited));
queue<pair<int,int>> q;
q.push({sr,sc});
visited[sr][sc]=1;
while(!q.empty()){
int r=q.front().first;
int c=q.front().second;
q.pop();
for(int d=0;d<4;d++){
int nr=r+dr[d];
int nc=c+dc[d];
if(nr<0||nr>N-1||nc<0||nc>M-1) continue;
if(map[nr][nc]=='W'||visited[nr][nc]) continue;
q.push({nr,nc});
//✨ visited를 방문 여부 + 최단 경로 저장용으로 사용한다.
visited[nr][nc]=visited[r][c]+1;
//✨ 최단 경로중 가장 먼 거리가 어딘지 갱신
maxVal=max(maxVal,visited[nr][nc]);
}
}
return maxVal-1;
}
int main(){
cin>>N>>M;
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
char val; cin>>val;
map[i][j]=val;
if(val=='L') lands.push_back({i,j});
}
}
//각 육지 좌표를 시작점으로 하여 최단 경로로 최대한 먼 거리 구하기.
for(int i=0;i<lands.size();i++){
res=max(res,bfs(lands[i].first,lands[i].second));
}
cout<<res<<"\n";
}
Reference
この問題について([BOJ/C+]#2589宝島), 我々は、より多くの情報をここで見つけました https://velog.io/@inryu/BOJ-C-2589-보물섬テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol