Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- DirectX12
- 바이토닉 수열
- 랜더링 파이프라인
- 24779
- 드래곤플라이트 모작
- lis응용
- 11286번
- BFS
- 2d 박스충돌
- 백준 c++ 24479번
- dx12 정리
- 4134번
- C++
- unrealengine
- 백준 1260 c++
- WinAPI
- 다음소수
- 뱀과사다리게임
- 다익스트라
- dx12
- 애니메이션
- 루트서명
- Unreal
- 백준
- 그리기 연산
- 2565번
- Perforce
- 백준 24444 c++
- directx12 그리기 연산2
- 2075번
Archives
- Today
- Total
game-1 님의 블로그
[백준] C++ 2178번: 미로 탐색 본문



풀이)
1. 큐 초기화
시작 좌표를 큐에 추가하고, 방문 배열에 1로 표시합니다.
2. 큐 탐색 반복
현재 좌표를 기준으로 상하좌우로 이동 가능한 지점을 계산합니다.
이동 조건(범위 내, 미방문, '1'인 지점)을 만족하면 큐에 추가하고, 방문 배열을 갱신합니다.
3. 최소 거리 저장
visited[ny][nx]에 현재까지의 이동 거리를 저장합니다.
BFS를 이용하여 문제를 해결하였고, 입력을 받는 배열의 경우 2차원 배열을 사용하는 대신에 string 배열을 사용하여 속도를 높였다.
코드)
#include<iostream>
#include<vector>
#include<queue>
#include<array>
using namespace std;
const int MAX = 101;
int n, m;
int cnt{};
int dx[4] = { 0, 0, -1, 1 }; //상하좌우
int dy[4] = { 1,-1, 0, 0 };
array<string, MAX> map;
int visited[MAX][MAX];
void bfs(int x, int y) {
queue<pair<int, int>> q;
q.push({ x,y });
visited[y][x] = ++cnt;
while (not q.empty()) {
int a = q.front().first;
int b = q.front().second;
q.pop();
for (int i = 0; i < 4; ++i) {
int nx = a + dx[i];
int ny = b + dy[i];
if (0 <= nx && nx <= m && 0 <= ny && ny < n &&
not visited[ny][nx] && map[ny][nx] == '1'){ //범위 안, 방문하지않고, 갈 수 있는 경우
q.push({ nx,ny });
visited[ny][nx] = visited[b][a] + 1;
++cnt;
}
}
}
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; ++i) {
cin >> map[i];
}
bfs(0, 0);
cout << visited[n - 1][m - 1];
}
궁금하신 점 있다면 댓글 남겨주시면 감사하겠습니다
'백준 문제풀이' 카테고리의 다른 글
| [백준] 1927번: 최소 힙 C++ (0) | 2025.01.08 |
|---|---|
| [백준] 7562번 C++ 나이트의 이동 (0) | 2025.01.04 |
| [백준] C++ 1012번: 유기농 배추 BFS (1) | 2025.01.02 |
| [백준] C++ 2667번: 단지번호붙이기 BFS (0) | 2025.01.01 |
| [백준] 1929번 C++ 소수구하기 (0) | 2024.12.27 |