드디어 BFS에 입문한다. 마구잡이식으로 풀기를 시작했더니 왜 BFS를 쓰는지 아직 모르겠음.. 미로탐색 당연히 DFS로 풀었더니 시간초과가 뜬다. 시간초과가 뜨는 코드는 아래와 같다.
#include<iostream>
using namespace std;
int N, M;
int map[101][101];
int dx[] = { 1, 0, 0, -1 };
int dy[] = { 0, 1, -1, 0 };
int ans = 9999;
void dfs(int x, int y, int cnt) {
if (x == N && y == M) {
if (cnt < ans) ans = cnt;
}
for (int i = 0; i < 4; i++) {
int next_x = x + dx[i];
int next_y = y + dy[i];
if (next_x < 1 || next_x > N || next_y < 1 || next_y > M) continue;
if (map[next_x][next_y] == 1) {
map[next_x][next_y] = 2;
dfs(next_x, next_y, cnt+1);
map[next_x][next_y] = 1;
}
}
}
int main() {
cin >> N >> M;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
scanf_s("%1d", &map[i][j]);
}
}
map[1][1] = 2;
dfs(1, 1, 1);
cout << ans;
return 0;
}
BFS를 쓰는 이유는 마지막에 최단경로만 뽑아내기 때문이라고 한다. 왜 최단경로가 되는거쥐? 찾아보니 아래와 같은 이유 때문이라고 한다.
BFS는 자신과 바로 연결되어 있는 노드들을 큐에 넣는다. 그리고 큐는 FIFO에 따라서 가장 먼저 들어온 것들을 가장 먼저 처리한다. 이 두 개가 특성이 결합되서 시작지점으로부터 간선의 수가 작은 곳 부터 먼저 처리한다. 따라서 간선 2개로 연결되어 있는 노드에 도달하는 경우가 간선 1개로 도달하는 경우는 발생하지 않는다.
그래도 아직 잘 모르겠음. 하나 발견하면 깊이 파고드는게 아니라 걍 바로 옆부터 방문하니까 그런지?
여튼 같은 레벨에 있는 애들은 count가 같으니까 전체를 세는 것이 아니라 최단 경로만 딱 세어 준다.
오늘은 여기까지만 생각하고 낼 생각해야징
BFS 답
#include<iostream>
#include<queue>
using namespace std;
int N, M;
int map[101][101] = { 0, };
int dx[] = { 1, -1, 0, 0 };
int dy[] = { 0, 0, 1, -1 };
queue<pair<pair<int,int>,int>> q;
int bfs(int x, int y) {
q.push(make_pair(make_pair(x, y),1));
while (!q.empty()) {
int row = q.front().first.first;
int col = q.front().first.second;
int cnt = q.front().second;
//cout << "(" << row << "," << col << ")" << " :" << cnt << endl;
q.pop();
if (row == N && col == M)return cnt;
for (int i = 0; i < 4; i++) {
int next_x = row + dx[i];
int next_y = col + dy[i];
if (next_x < 1 || next_x > N || next_y < 1 || next_y > M) continue;
if (map[next_x][next_y] == 1) {
map[next_x][next_y] = 2;
q.push(make_pair(make_pair(next_x, next_y),cnt+1));
}
}
}
}
int main() {
cin >> N >> M;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
scanf_s("%1d", &map[i][j]);
}
}
map[1][1] = 2;
int ans = bfs(1, 1);
cout << ans;
return 0;
}
'Programming > BOJ' 카테고리의 다른 글
[백준/C++] 2606번: 바이러스 (플로이드 와샬/DFS/BFS) (0) | 2020.08.05 |
---|---|
[백준/C++] 백준 2309번: 일곱 난쟁이 (0) | 2020.08.04 |
[백준/C++] 백준 1012번: 유기농 배추 (0) | 2020.08.01 |
[백준/C++] 백준 1946번: 신입 사원 (2) | 2020.07.30 |
[백준/C++] 백준 1987번: 알파벳 (0) | 2020.07.28 |