Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- LIS #가장긴증가하는부분수열 #
- 줄어드는수
- 30870
- 20117
- hcpc
- c++ #boj #
- 코딩
- 백준
- BOJ
- 3D #Reconstruction #computer #vision #volume #metric #tsdf #kinect #fusion
- 호반우 상인
- graph #최단경로
- 진법변환 #2to10 #10to2 #이진법 #십진법 #변환 #bitset #c++
- backtracking #codetree #디버깅 #삼성코테
- 22869
- 16202
- graph
- 투포인터 #백준 #boj #20922 #22862
- N번째큰수
- 최소 #공배수 #최대 #공약수 #유클리드 #호제법 #lcm #gcd #c++ #boj #3343 #백준 #장미
- boj #백준
- 3343
- 백준 #다익스트라 #dijkstra #9370 #c++
- 쌤쌤쌤
- C++
- 사이클 없는 그래프
- 1174
- 레드아보
- 이분탐색 #dp #11053
- c++ #입출력 #속도 #ios #sync_with_stdio #cin #cout #tie
Archives
- Today
- Total
hyunjin
[C++][BOJ2582 보물섬] BFS 본문
728x90
L 인 곳에서 BFS 다 돌려본다.
소스코드
#include <bits/stdc++.h>
using namespace std;
char land[51][51];
bool visited[51][51]={0,};
int dx[]={0,0,1,-1}, dy[]={1,-1,0,0};
int h,w,ans=0;
struct treasure{
int y,x,d;
};
void Input(){
cin >> h >>w;
for(int i = 0 ; i < h;i++){
for(int j = 0 ; j < w;j++){
cin>>land[i][j];
}
}
}
void BFS(int a,int b){
queue<treasure> q;
q.push({a,b,0});
visited[a][b] = true; // for 돌기전에 true로 해야 다시 돌아오지 않음
while(!q.empty()){
treasure cp = q.front();
q.pop();
for(int i =0 ; i<4 ;i++){
int y = cp.y+dy[i];
int x = cp.x+dx[i];
if(y<0 || y >= h || x < 0 ||x >=w) continue;
if(land[y][x] == 'W'||visited[y][x] ) continue;
visited[y][x]=true;
ans = max(ans,cp.d+1);
q.push({y,x,cp.d+1});
}
}
}
void Solution(){
for(int i = 0 ; i < h;i++){
for(int j = 0 ; j < w;j++){
if(land[i][j]=='L') {
BFS(i,j);
memset(visited,0,sizeof(visited));
}
}
}
cout<<ans;
}
void Slove(){
Input();
Solution();
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
Slove();
}
시간초과 소스코드
#include <bits/stdc++.h>
using namespace std;
char land[51][51];
bool visited[51][51]={0,};
int dis[51][51]={0,};
int dx[]={0,0,1,-1}, dy[]={1,-1,0,0};
int h,w,ans=0;
void Input(){
cin >> h >>w;
for(int i = 0 ; i < h;i++){
for(int j = 0 ; j < w;j++){
cin>>land[i][j];
}
}
}
void BFS(int a,int b){
queue<pair<int,int>>q;
q.push({a,b});
dis[a][b]=0;
while(!q.empty()){
pair<int,int> cp = q.front();
visited[cp.first][cp.second] = true;
q.pop();
for(int i =0 ; i<4 ;i++){
int y = cp.first+dy[i];
int x = cp.second+dx[i];
if(y<0 || y >= h || x < 0 ||x >=w) continue;
if(land[y][x] == 'W'||visited[y][x] ) continue;
dis[y][x] = dis[cp.first][cp.second] + 1;
ans = max(ans,dis[y][x]);
q.push({y,x});
}
}
}
void Solution(){
for(int i = 0 ; i < h;i++){
for(int j = 0 ; j < w;j++){
if(land[i][j]=='L') {
BFS(i,j);
memset(visited,0,sizeof(visited));
memset(dis,0 ,sizeof(dis));
}
}
}
cout<<ans;
}
void Slove(){
Input();
Solution();
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
Slove();
}
다른 점은 bfs에서 visited true 해주는 위치다.
q에 넣으면서 바로 true를 해줘야한다.
그렇지 않으면 방문한곳 다시 que에 또 넣게 되는 현상 발생.
728x90
'알고리즘 연습 > 백준' 카테고리의 다른 글
[C++][N 번째 큰 수 2075] 우선 순위 큐 (0) | 2021.09.02 |
---|---|
[C++][좌표 압축 18870] 정렬, 벡터 복사, 중복 제거 ,lower_bound (0) | 2021.09.02 |
[C++][토마토 BOJ7569] BFS (0) | 2021.08.03 |
[C++][BOJ 12886 돌그룹] (0) | 2021.07.27 |
[C++][BOJ 11000 강의실 배정]그리디,정렬,우선순위큐 (0) | 2021.07.26 |