티스토리 뷰
백준 2178번 미로 탐색입니다.
최단 거리를 계산할때, 배열에 인덱스에 접근할때마다 전에 있는 인덱스의 cnt를 하나 증가시킨 값을 넣어요. 결국 최종 종착점에는 이동한 거리가 찍히겠죠?
밑에는 제코드예요.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <iostream> #include <queue> #define MAX 105 using namespace std; typedef struct rc { int r; int c; }Position; int cnt; int N, M; bool visited[MAX][MAX]; int maze[MAX][MAX]; bool isSafe(int r,int c) { //범위 벗어나는지 체크 if ((r<0 || r>N) || (c<0 || c>M)) return false; else return true; } void bfs() { Position pos; pos.r = 0; pos.c = 0; visited[0][0] = true; queue<Position> q; q.push(pos); while (!q.empty()) { int r = q.front().r, c = q.front().c; if (r == N - 1 && c == M - 1) break; //현재 위치에서 갈 수 있는 점을 찾아요 if (maze[r - 1][c] && !visited[r - 1][c] && isSafe(r - 1, c)) { //길이 있고, 방문하지 않았고, 범위 벗어나지 않으면 pos.r = r - 1; pos.c = c; //그 점의 좌표를 큐에 넣어요 visited[r - 1][c] = true; maze[r - 1][c] = maze[r][c] + 1; q.push(pos); } if (maze[r + 1][c] && !visited[r + 1][c] && isSafe(r + 1, c)) { pos.r = r + 1; pos.c = c; visited[r + 1][c] = true; maze[r + 1][c] = maze[r][c] + 1; q.push(pos); } if (maze[r][c - 1] && !visited[r][c - 1] && isSafe(r, c - 1)) { pos.r = r; pos.c = c - 1; visited[r][c - 1] = true; maze[r][c - 1] = maze[r][c] + 1; q.push(pos); } if (maze[r][c + 1] && !visited[r][c + 1] && isSafe(r, c + 1)) { pos.r = r; pos.c = c + 1; visited[r][c + 1] = true; maze[r][c + 1] = maze[r][c] + 1; q.push(pos); } q.pop(); } } int main(void) { std::ios::sync_with_stdio(false); cin >> N >> M; int many = 0; for (int i = 0; i < N; i++) { for (int k = 0; k < M; k++) { char way; cin >> way; maze[i][k] = way - '0'; } } bfs(); cout << maze[N - 1][M - 1] << '\n'; return 0; } | cs |
'Coding > acmicpc' 카테고리의 다른 글
백준 1707:이분 그래프 (0) | 2018.03.18 |
---|---|
백준 11403:경로찾기 (0) | 2018.03.14 |
백준 9466:텀 프로젝트 (4) | 2018.03.09 |
백준 1743:음식물 피하기 (0) | 2018.02.28 |
백준 10451:순열 사이클 (0) | 2018.02.28 |