# 문제
# 입력 및 출력
# 풀이
처음엔 DFS로 풀어야 하나 했는데
분류를 보니까 BFS로 풀라고 적혀있어서 BFS로 풀어봤다
시작점의 상하좌우를 보면서 길이 있는지 확인해야하는데
이때 상하좌우를 보는 걸 하나하나 구현해야 싶어서 또 구글링,,ㅋㅋㅋㅋ
찾아보니까 dx, dy배열을 만들어서 반복문으로 구현한 사람이 있어서 그 코드를 따라했다
큐에 넣고 빼는 동작 뿐이라 코드가 길진 않다
코드 아래 블로그 참고
https://cocoon1787.tistory.com/115
[C/C++] 백준 2178번 미로탐색 (BFS, DFS)
문제 N×M크기의 배열로 표현되는 미로가 있다. 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 1 미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때,..
cocoon1787.tistory.com
1) 시작점 (1,1)를 큐에 넣기
2) 큐의 첫번째 순서쌍의 상하좌우 접근 -> 길이 있으면 방문했다고 하고 큐에 넣은 다음 dis 배열을 현재 +1로 설정
3) 2번을 큐가 빌 때까지 반복
나는 위의 사진처럼 조건문으로 배열 인덱스 초과 에러를 잡기 보다는 배열의 크기를 상하, 좌우로 한 칸씩 늘려서
크기를 102칸으로 만들고 늘린 칸들은 전부 길이 없다는 뜻인 0으로 채워놓았다
그러면 따로 추가 조건문 없이 배열 인덱스 초과 에러를 잡을 수 있음
#include <iostream>
#include <queue>
#pragma warning(disable:4996)
using namespace std;
int miro[102][102];
int dis[102][102];
int visit[102][102];
int dx[4] = { -1,1,0,0 };
int dy[4] = { 0,0,-1,1 };
queue<pair<int, int>> q;
int main() {
int N, M;
cin >> N >> M;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
scanf("%1d", &miro[i][j]);
}
}
dis[1][1] = 1;
visit[1][1] = 1;
q.push(make_pair(1, 1));
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (!visit[nx][ny] && miro[nx][ny]) {
visit[nx][ny] = 1;
q.push(make_pair(nx, ny));
dis[nx][ny] = dis[x][y] + 1;
}
}
}
cout << dis[N][M] << "\n";
}
'Algorithm > 📖Baekjoon' 카테고리의 다른 글
#1003 피보나치 함수 (0) | 2022.05.04 |
---|---|
#2667 단지번호붙이기 (0) | 2022.05.03 |
#1946 신입 사원 (0) | 2022.05.01 |
#10610 30 (0) | 2022.04.28 |
#11279 최대 힙 (0) | 2022.04.27 |
댓글