티스토리 뷰
이문제는 BFS 입문에 아주 좋은 문제 이다.
문제링크 : 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 를 구현 해준다. 대부분의 BFS 문제가 그러하듯이 방문 유무를 결정 지어주는
visited[ ][ ] 2차원 배열을 이용하여 이동할 때 마다 y좌표 x 좌표 를 넣어준다.
만약 다음에 이동할 맵이 방문 한 적이 없다면 현재 까지 온 거리에서 '+1 ' 해주어 거리 계산을 해준다.
------------------------------------------------------------------------------------------------------------------------
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
#include<iostream>
#include<cstdio> // scanf
#include<queue>
using namespace std;
queue<pair<int ,int> > q;
int vety[]={1,0,-1,0};
int vetx[]={0,-1,0,1};
int map[101][101];
int visited[101][101];
int N,M; // N, M(2 ≤ N, M ≤ 100)
void BFS()
{
int i,j,cury,curx;
while(!q.empty() )
{
cury = q.front().first;
curx = q.front().second;
q.pop();
for(i=0 ; i <4; i++)
{
int nexty = cury + vety[i];
int nextx = curx + vetx[i];
if(nextx>=1 && nextx <= M && nexty>=1 && nexty<=N )
if(map[nexty][nextx] && !visited[nexty][nextx])
{
visited[nexty][nextx] = visited[cury][curx] + 1 ;
q.push({nexty , nextx});
}
}
}
}
int main()
{
int i,j;
cin >> N >> M;
for(i=1 ; i<= N ; i++)
for(j=1 ; j<=M; j++)
scanf("%1d",&map[i][j]);
//y좌표 x 좌표 인큐.
visited[1][1]=1;
q.push( { 1 , 1 } );
BFS();
cout << visited[N][M];
return 0;
}
|
'백준 (BOJ) > BFS' 카테고리의 다른 글
백준)14502-연구소 (0) | 2019.04.27 |
---|---|
백준)1012-유기농 배추 (0) | 2019.04.27 |
백준)2667-단지번호 붙이기 (0) | 2019.04.27 |
백준)7576-토마토 (0) | 2019.04.27 |
백준)1697-숨박꼭질 (0) | 2019.04.27 |
- Total
- Today
- Yesterday
- BFS
- 백트레킹
- #스페인어 #스페인어인강 #스페인어공부 #시원스쿨스페인어
- stri
- 라오킹전사
- 그리디
- 그래프
- 사이클
- HTML
- 라이즈오브킹덤즈
- dfs
- greedy
- KVK4
- A
- 다익스트라
- 이분매칭
- php
- CSS
- 사이크
- 그리디알고리즘
- 플로이드
- 백트래킹
- 정렬
- JavaSwing
- 이분 매칭
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |