본문 바로가기

1p1d

[Day 3] 백준 2589 : 보물섬

해법 : bfs

최단 거리들 중에서 최대값을 찾아야하는데 

map의 크기가 50*50이기 때문에 각각의 점들에 대해서 bfs를 각각 돌려도 시간복잡도가 충분히 나온다. 

 

 

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;

int n,m;
int M[55][55];
int vt[55][55];
int que[2505][3];
int r,f;
int _max;
int X[4]={0,0,1,-1};
int Y[4]={1,-1,0,0};
void bfs(int x,int y) {
    que[r][0]=x;
    que[r][1]=y;
    que[r++][2]=1;
    int i,j;
    for(i=0;i<n;i++) {
        for(j=0;j<m;j++) {
            vt[i][j]=0;
        }
    }
    vt[x][y]=1;
    int p_x,p_y,p;
    //printf("%d %d\n",x,y);
    do {
        p_x=que[f][0];
        p_y=que[f][1];
        p=que[f++][2];
        //printf("%d %d %d\n",p_x,p_y,p);
        _max=max(_max,p);
        for(i=0;i<4;i++) {
            x=p_x+X[i];
            y=p_y+Y[i];
            if(x<0 || x>=n || y<0 || y>=m) continue;
            if(M[x][y]==1 && vt[x][y]==0) {
                que[r][0]=x;
                que[r][1]=y;
                que[r++][2]=p+1;
                vt[x][y]=1;
            }
        }
    } while(r>f);
}
int main() {
    //freopen("input.txt","r",stdin);
    scanf("%d %d",&n,&m);
    int i,j;
    char srg[55];
    for(i=0;i<n;i++) {
        scanf("%s",srg);
        for(j=0;j<m;j++) {
            if(srg[j]=='L') {
                M[i][j]=1;
            }
        }
    }
    for(i=0;i<n;i++) {
        for(j=0;j<m;j++) {
            //printf("%d ",M[i][j]);
            if(M[i][j]==1) {
                r=0,f=0;
                bfs(i,j);
            }
            //printf("\n");
        }

    }
    printf("%d\n",_max-1);
    return 0;
}

'1p1d' 카테고리의 다른 글

[Day 4] 백준 9663 : N-queen  (0) 2021.01.24
[Day 4] 백준 7569 : 토마토  (0) 2021.01.24
Schedule  (0) 2021.01.23
[Day 1] 백준 1753 : 최단경로  (0) 2021.01.22
[Day 1] 백준 1937 : 욕심쟁이 판다  (0) 2021.01.22