문제출처: https://www.acmicpc.net/problem/2178
풀이
최단거리구하기. 즉 dfs가 아닌 bfs를 사용해야합니다. 저는 방문 배열을 선언하여 0을 방문하지않았을 때를 의미하고 그외에 모든 양수값은 방문처리가 되었을때, 그리고 동시에 그값이 최단거리(칸)을 의미하게 함으로써 check[n-1][m-1]이 답이 될 수 있게끔 로직을 구성했습니다.
1. map을 입력받습니다.
2. 0,0좌표를 시작으로 bfs를 돌립니다. 주위에 길이있고 방문하지않은 좌표를 최단칸으로 갱신합니다.(check배열로 갱신)
3. 최종적으로 check[n-1][m-1]은 0,0좌표부터 현재의 좌표까지의(답) 최단칸수입니다.
코드
#include<iostream> #include<queue> using namespace std; char map[100][100]; int check[100][100]; int dx[4] = { 0,0,1,-1 }; int dy[4] = { -1,1,0,0 }; int n, m; void bfs(int y, int x); int main() { cin >> n >> m; for (int i = 0; i < n; i++) cin >> map[i]; //시작위치가 정해져있으므로 바로 bfs! bfs(0, 0); //15행 선언후 아래 행 먼저선언하자(어짜피 머릿속으로 이렇게 계산하자고생각했으므로) //check배열에 0,0부터 현재좌표까지의 최단칸수담음 cout << check[n - 1][m - 1] << endl; } void bfs(int y,int x) { queue<pair<int, int>>q; q.push({ y,x }); check[y][x] = 1; while (!q.empty()) { x=q.front().second; y=q.front().first; q.pop(); for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 0 && ny >= 0 && nx < m && ny < n) { //길이있고, 방문하지않았으면 방문 및 최단거리 갱신 if (map[ny][nx] == '1' && check[ny][nx] == 0) { q.push({ ny,nx }); check[ny][nx] = check[y][x] + 1; } } } } }
결과
'문제풀이(BOJ) > DFS,BFS' 카테고리의 다른 글
[백준 1012] 유기농 배추 (DFS) (0) | 2020.01.15 |
---|---|
[백준 1012] 유기농 배추 (BFS) (0) | 2020.01.15 |
[백준 7576] 토마토 (BFS) (0) | 2020.01.15 |
[백준 2573] 빙산 (0) | 2019.12.14 |
[백준 10026] 적록색약 (0) | 2019.12.14 |