https://www.acmicpc.net/problem/2178
가장 쉬운 bfs문제입니다.
최소의 칸 수를 구하라? 즉 bfs를 이용해서 가장 먼저 도달하는 너비를 출력하라는 말입니다.
bfs는 항상 최적을 보장하기 때문입니다.
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 77 78 | #include <stdio.h> const int QUEUE_SIZE = 100 * 100 * 4; typedef struct qs { int x, y, b; }qs; typedef struct queue { qs data[QUEUE_SIZE]; int front, rear; queue() { front = rear = 0; } int empty() { return front == rear; } void push(qs d) { rear = (rear + 1) % QUEUE_SIZE; data[rear] = d; } qs pop() { front = (front + 1) % QUEUE_SIZE; return data[front]; } }queue; int dx[4] = { 1, 0, -1, 0 }; int dy[4] = { 0, -1, 0, 1 }; char map[100][100]; int visit[100][100]; int main() { int m, n; scanf("%d %d", &m, &n); getchar(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { map[i][j] = getchar(); } getchar(); } queue q; q.push(qs{0, 0, 1}); visit[0][0] = 1; while (!q.empty()) { qs front = q.pop(); if (front.x == m - 1 && front.y == n - 1) { printf("%d", front.b); break; } for (int i = 0; i < 4; i++) { int nx = front.x + dx[i]; int ny = front.y + dy[i]; if (nx < 0 || ny < 0 || nx >= m || ny >= n || visit[nx][ny]) continue; if (map[nx][ny] == '0') continue; visit[nx][ny] = 1; q.push(qs{ nx, ny, front.b + 1 }); } } return 0; } | cs |
'알고리즘 > 탐색' 카테고리의 다른 글
[2667] 단지번호붙이기 (0) | 2017.09.15 |
---|---|
[10216] Count Circle Groups (0) | 2017.08.10 |
[10451] 순열 사이클 (0) | 2017.07.27 |
[10974] 모든 순열 (2) | 2017.07.27 |
[1058] 친구 (0) | 2017.07.20 |