백준 2178 - 미로 탐색
문제
백준 2178 - 미로 탐색 풀러가기
문제 분석
1,1에서 m,n으로 가는 최소 칸 수 를 구하는 문제로, bfs를 이용할 수 있다.
문제 풀이
-
전체 코드
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include <cstdio>#include <queue>using namespace std;int n, m;int maze[101][101];int visit[101][101];int dx[] = { 1,0,0,-1 };int dy[] = { 0,1,-1,0 };queue<pair<int, int>> q;void bfs() {while (!q.empty()) {int cr = q.front().first;int cc = q.front().second;for (int k = 0; k < 4; k++) {int nr = cr + dy[k];int nc = cc + dx[k];if ((0 < nr && nr <= n) && (0 < nc && nc <= m)) {if (maze[nr][nc] == 1 && visit[nr][nc] == 0) {visit[nr][nc] = visit[cr][cc] + 1;if (nr == n && nc == m) {return;}q.push(make_pair(nr, nc));}}}q.pop();}}int main() {scanf("%d %d", &n, &m);for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {scanf("%1d", &maze[i][j]);}}q.push(make_pair(1,1));visit[1][1] = 1;bfs();printf("%d", visit[n][m]);return 0;}cs - 8~9번째 : 위치 (1,1)을 배열에서도 [1] [1]에 접근하고 싶어서 size를 [101] [101]로 잡았다.
-
bfs 함수
1234567891011121314151617181920void bfs() {while (!q.empty()) {int cr = q.front().first;int cc = q.front().second;for (int k = 0; k < 4; k++) {int nr = cr + dy[k];int nc = cc + dx[k];if ((0 < nr && nr <= n) && (0 < nc && nc <= m)) {if (maze[nr][nc] == 1 && visit[nr][nc] == 0) {visit[nr][nc] = visit[cr][cc] + 1;if (nr == n && nc == m) {return;}q.push(make_pair(nr, nc));}}}q.pop();}}cs - 11번째 : 다음 번 row와 column의 값이 n, m과 같다면 문제에서 목표한 바를 이룬 것 이므로 bfs 함수를 종료한다.
연관 문제
아직 배움의 과정에 있는 학생이니 내용에 부족한 점이 보이면 지적은 하되, 비난은 하지 말아주세요!!
댓글남기기