I. 문제

<입력 형식>

첫 줄에 미로의 크기 X, Y(1≤X, Y≤100)가 주어진다.
둘째 줄에 출발점 x, y 좌표와 도착점 x, y 좌표가 공백으로 구분하여 주어진다.
셋째 줄부터 미로의 정보가 길은 0, 벽은 1로 공백이 없이 들어온다.

<출력 형식>

첫 줄에 출발점에서 도착점까지 가장 빠른 시간을 출력한다.

입력 출력
8 7
1 2 7 5
11111111
00000111
10110011
10111001
10111101
10000001
11111111
9

 


II. 접근

1. 현재 위치 x,y 와 시간t를 담을 수 있는 구조체 생성.
2. 현 위치에서 다음 4방향의 0인 위치의 정보 구조체를 Queue에 저장
3. Queue를 순차적으로 pop()하며 이동 및 2. 반복
4. 목적지 도착하면 return
* visit배열 없이 map을 1로 손상시키면서 확산

 


III. Code

<hide/>
#include <queue> // c++의 Queue STL
#include <iostream>
#include <cstring> // memset위해서
using namespace std;

/*
배열의 인덱스, 현재까지의 시간 구조체
Queue에 정보를 다 넣어야하기 때문에 구조체 정의함.
*/
struct stu {
    int y;
    int x;
    int t;
};

int X, Y;
int sx, sy, ex, ey; // 시작s와 끝e
queue<stu> Q;
int map[100 + 10][100 + 10]; // 지도

// 이번 경우에는 map을 0->1로 훼손하며 방문표시함 visit 사용X
// int visit[100 + 2][100 + 2];

void input() {
    cin >> X >> Y;
    cin >> sx >> sy >> ex >> ey;
    for (int i = 1; i <= Y; i++) {
        for (int j = 1; j <= X; j++) {
            scanf("%1d", &map[i][j]);
        }
    }
}

int BFS() {
	// 상하좌우 탐색 위한 dy,dx
    int dy[4] = { 0,0,-1,1 };
    int dx[4] = { 1,-1,0,0 };

    // Q에 초기정보를 stu구조로 push함 (map[0][0]과 time =0)
    Q.push(stu{ sy,sx,0 });
    map[sy][sx] = 1;

    //Q가 텅 빌때까지 반복(모든노드 탐색)
    while (!Q.empty()) {
        stu curstu = Q.front(); //현재정보
        Q.pop(); //큐에서 제거

        //4가지 방향을 모두 확인해본다.
        for (int d = 0; d < 4; d++) {
			// 다음정보를 계산해줌
            int nextx = curstu.x + dx[d];
            int nexty = curstu.y + dy[d];
            int nextt = curstu.t + 1;
            
            if (nexty == ey and nextx == ex) return curstu.t + 1; // 마지막 도착하면 return
            
            if (nexty == 0 or nextx == 0 or
                nexty == Y+1 or nextx == X+1) continue; // 배열 벗어나면 무시
                
                
            // 다음위치가 0이라면 확산
            if (!map[nexty][nextx]) {
                Q.push(stu{ nexty,nextx,nextt }); // 다음 정보 Q에 Push
                map[nexty][nextx] = 1; // map 훼손하며 방문표시 
            }
        }
    }
    return -1; // 해도되고 안해도 됨. 못찾을 때 대비
}

int main() {
    memset(map, 0, sizeof(map));
    
    input();
    
    int ans = BFS();
    cout << ans;

    return 0;
}

 

문제 출처 www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=934&sca=99

'Algorithm > BFS' 카테고리의 다른 글

[Algorithm][BFS][정올] 1078 : 저글링 방사능 오염  (0) 2020.12.03
[Algorithm][BFS] BFS 개념 및 구현  (0) 2020.12.03

+ Recent posts