- (1,1)에서 (N,M)으로 가는 "가장 빠른 길"을 구하는 문제
- 가장 빠른 길을 구해야 할 때는 DFS 탐색은 사용X = 최단거리 보장X
- BFS는 모든 가중치가 1일때 좋은 성능을 보임
DFS, BFS => 목적은 모든 정점을 한번 씩 방문한다
- 최단거리를 구하기 위해 dist[][] 를 만들어 거리 저장
https://www.acmicpc.net/problem/2178
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
#include <iostream>
#include <queue>
#include <cstdio>
using namespace std;
int map[110][110];
int visited[110][110];
int dist[110][110];
int n,m;
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
//최단 경로이기 때문에 bfs 이용
int main(void){
scanf("%d %d", &n, &m);
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
scanf("%1d", &map[i][j]);
visited[i][j]=0;
}
} // 입력 끝.
queue<pair<int, int> > q;
q.push(make_pair(0,0));
dist[0][0] = 1;
visited[0][0] = 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(nx>=0 && nx<n && ny>=0 && ny<m){
if(map[nx][ny]==1 && visited[nx][ny]==0){
q.push(make_pair(nx,ny));
dist[nx][ny] = dist[x][y] + 1;
visited[nx][ny] = 1;
}
}
}
}
printf("%d", dist[n-1][m-1]);
}
'BOJ' 카테고리의 다른 글
BOJ 2583 영역 구하기 DFS (0) | 2019.04.06 |
---|---|
BOJ 1697 숨바꼭질 BFS (0) | 2019.04.06 |
BOJ 1012 유기농 배추 DFS (0) | 2019.04.06 |
BOJ 1926 그림 - DFS (0) | 2019.04.06 |
BOJ 7576 토마토 - BFS (0) | 2019.04.05 |