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 |
Tags
- dp
- NeuralNetwork
- Node.js
- 문제풀이
- 캡스톤정리
- dfs
- 알고리즘
- 백트래킹
- 탐색
- mysql
- 플로이드와샬
- Stack
- ios
- 백준
- sigmoid
- 프로그래머스
- 그리디
- 풀이
- Docker
- DeepLearning
- Greedy
- 실버쥐
- 부르트포스
- ReLU
- Blockchain
- 그래프
- BFS
- Swift
- C++
- Algorithm
Archives
- Today
- Total
개발아 담하자
[백준/C++] 2178번 : 미로 탐색 풀이 본문
문제 2178 : 미로 탐색
문제 링크 : https://www.acmicpc.net/problem/2178
문제
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은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.
위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.
입력
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
출력
첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.
간단한 BFS 문제이다. ans 배열에 지나온 길을 저장했다.
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
int n, m;
int map[101][101];
int ans[101][101];
int dx[] = {-1,1,0,0};
int dy[] = {0,0,-1,1};
queue<pair<int,int>> que;
void bfs(){
int cur_y=0, cur_x=0;
que.push(make_pair(cur_y, cur_x));
ans[cur_y][cur_x] = 1;
int nx, ny;
while(!que.empty()){
cur_y = que.front().first;
cur_x = que.front().second;
que.pop();
for(int i=0; i<4; i++){
ny = cur_y + dy[i];
nx = cur_x + dx[i];
if(ny<0 || nx<0 || ny>=n || nx>=m)
continue;
if(map[ny][nx]==0)
continue;
if(ans[ny][nx]==0 && map[ny][nx]==1){
ans[ny][nx] = ans[cur_y][cur_x] + 1;
que.push(make_pair(ny, nx));
}
}
}
}
int main(void){
cin>>n>>m;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
scanf("%1d", &map[i][j]);
}
}
bfs();
cout << ans[n-1][m-1];
return 0;
}
풀이 인증입니다.
'👩💻 알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준/C++]9095번 : 1, 2, 3 더하기 풀이 (0) | 2020.01.26 |
---|---|
[백준/C++]1463번 : 1로 만들기 풀이 (0) | 2020.01.22 |
[백준/C++] 2667번 : 단지번호 붙이기 풀이 (0) | 2020.01.20 |
[백준/C++] 7576번 : 토마토 풀이 (0) | 2020.01.20 |
[백준/C++] 1697번 : 숨바꼭질 풀이 (0) | 2020.01.19 |