알고리즘

88. 미로의 최단거리 [BFS]

홍루피 2021. 3. 17. 21:18

인프런 - it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 강의를 바탕으로 공부한 내용입니다.

문제는 비공개로 입력예제와 출력예제만을 가지고 포스팅

 

 

풀이 

- 앞서 푼 섬나라 아일랜드 문제와 매우 유사한 BFS 문제

- 상하좌우 좌표를 배열로 미리 명시해 두고 이동할 좌표를 계산해 놓아야 함

- 첫 위치를 큐에 넣고 map[1][1]=1로 체크 한다.

- 큐의 첫번째 요소를 tmp에 저장해 놓고 Q에서 pop한다.

- 4번의 반복으로 상하좌우 좌표값을 xx, yy로 만들며 0(도로)인 곳을 탐색

=> 이때 좌표가 정해진 7*7을 벗어나지 않도록 if문 안에 조건 추가

- 만약 도로라면 dis배열의 값을 업데이트하는데 이때값은 dis[tmp.x][tmp.y]+1의 값을 가짐

#include <stdio.h>
#include <algorithm>
#include <queue>
using namespace std;
int n, map[10][10], dis[10][10];
int dx[4]={0, 1, 0, -1};
int dy[4]={-1, 0, 1, 0};

//88. 미로의 최단거리 통로(BFS)

struct Loc{
    int x;
    int y;
    Loc(int a, int b){
        x=a;
        y=b;
    }
};

queue<Loc> Q;

int main(){
    for(int i=1;i<=7;i++){
        for(int j=1;j<=7;j++){
            scanf("%d", &map[i][j]);
        }
    }
    Q.push(Loc(1,1));
    map[1][1]=1;
    while(!Q.empty()){
        Loc tmp=Q.front();
        Q.pop();
        for(int i=0;i<4;i++){
            int xx=tmp.x+dx[i];
            int yy=tmp.y+dy[i];
            if(map[xx][yy]==0 && xx>=1 && xx<=7 && yy>=1 && yy<=7){
                Q.push(Loc(xx, yy));
                map[xx][yy]=1;
                dis[xx][yy]=dis[tmp.x][tmp.y]+1;
            }
        }
    }
    printf("%d", dis[7][7]);
    return 0;
}