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 |
Tags
- 백준 한국이 그리울 땐 서버에 접속하지
- 백준 10709
- C++ 9996
- 운영체제
- 월곡중 학원
- c++ split
- 백준 패션왕 신해빈
- 백준 9375번 패션왕 신해빈
- 관리형 학원
- 백준 14246번
- 백준 dfs
- 월곡역 학원
- DFS
- 월곡중학교 학원추천
- OS
- 백준 토마토
- 백준 2309번 일곱 난쟁이
- c++ 조합
- 서울사대부고 학원
- C# 병합정렬
- 백준 14246번 K보다 큰 구간
- C++ 문자열
- 백준 K보다 큰 구간
- 백준 1049번
- 성북구 학원
- 상월곡동 학원
- 상월곡역 학원
- 고정 소수점
- 월곡동 학원추천
- 백준 1049번 기타줄
Archives
- Today
- Total
키베이루's diary
[C++] 백준 2178번 미로 탐색 본문
1) 문제설명
https://www.acmicpc.net/problem/2178
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
2) 아이디어
거리의 최소를 찾기 위해 BFS를 사용했다.
처음 좌표를 (1,1)로 설정하고 BFS를 통해 값이 1인 곳을 찾아 탐색하였다.
BFS로 탐색하기 때문에 1이 존재하는 모든 구간을 탐색한다.
따라서 전역 변수를 설정하여 1인 곳을 방문할 때마다 카운트를 세어주는 것이 아닌 거리에 따른 변수를 하나 설정하여 카운트를 센다.
또한 방문한 곳을 표시하거나 초기화시켜주지 않으면 큐의 메모리 초과가 일어나므로 방문한 곳을 표시하거나 초기화시켜주어야 한다.
3) 코드
#include<iostream>
#include<queue>
#include<deque>
#include<string.h>
#include<math.h>
#include<cmath>
#include<stack>
#include<algorithm>
using namespace std;
int arr[100][100];
int range[100][100]; // 거리저장
int n, m;
void bfs(int x, int y) {
queue <pair<int,int>> q;
q.push(make_pair(x,y));
int dx[] = { 1,0,-1,0 }; // x좌표 움직임
int dy[] = { 0,1,0,-1 }; // y좌표 움직임
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
arr[x][y] = 0; // 방문한 곳 초기화
q.pop();
if (x == n && y == m) { // 목적지 도착하면 종료
break;
}
for (int i = 0; i < 4; i++) { // 현재 위치에서 상하좌우에 1이있나 탐색
int nx, ny; // 다음에 갈 좌표변수
nx = x + dx[i];
ny = y + dy[i];
if (nx<1 || nx>n || ny<1 || ny>m) { // 범위를 넘어갈때
continue;
}
if (arr[nx][ny] == 1) { // 현재 x,y 의 위치에서 상하좌우에 1이 있을경우
range[nx][ny] = range[x][y] + 1; // 한칸씩 갈때마다 거리 + 1
arr[nx][ny] = 0; // 내가 다음에 방문할 곳을 미리 초기화시켜서 메모리 초과를 막는다.
q.push(make_pair(nx, ny)); // 큐에 넣는다
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
scanf("%1d", &arr[i][j]);
}
}
bfs(1, 1);
cout << range[n][m] + 1;
}
queue의 pair선언과 make_pair를 잘 기억해두어야겠다.
'알고리즘 > BFS, DFS' 카테고리의 다른 글
[C++] 백준 7576번 토마토 (0) | 2022.06.10 |
---|---|
[C++] 백준 7562번 나이트의 이동 (0) | 2022.06.10 |
[C++] 백준 1012번 유기농 배추 (0) | 2022.06.08 |
[C++] 백준 2667번 단지번호붙이기 (0) | 2022.06.08 |
[C++] 백준 24445번 알고리즘 수업 - 너비 우선 탐색 2 (0) | 2022.06.07 |
Comments