해당 문제는 BFS를 사용하여서 문제를 풀 수 있습니다.
BFS로 0,0부터 시작해서 vis[0][0]에 1을 넣고 시작합니다.
그리고 continue 조건에서 1보다 클 때만 continue 시키도록 합니다 그 이유는 nx,ny값에
움직이기 전의 값인 cur.first, cur.second의 값의 +1한 값을 넣어야 하는데 같은 높이에 위치하는 노드 중 어떠한 한 노드가 먼저 방문을 했다면 최단거리를 구하기 위해 continue를 시켜 +1를 하지 않게 해야 합니다
그럼 while문이 끝나고 Q가 비었을때 vis[n-1][m-1]을 출력한다면 미로의 최단거리가 나옵니다.
#include <iostream>
#include <queue>
using namespace std;
int board[101][101] = {0,};
int vis[101][101] = {0,};
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
int main(){
int n, m;
cin >> n >> m;
char c;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> c;
if(c == '0'){
board[i][j] = 0;
}
else{
board[i][j] = 1;
}
}
}
queue<pair<int,int> > Q;
Q.push({0,0});
vis[0][0] = 1;
while(!Q.empty()){
pair<int,int> cur = Q.front(); Q.pop();
for(int k = 0; k < 4; k++){
int nx = cur.first + dx[k];
int ny = cur.second + dy[k];
if((nx < 0 || nx >= n) || (ny < 0 || ny >= m)) continue;
if((board[nx][ny] == 0) || (vis[nx][ny] > 1)) continue;
Q.push({nx,ny});
vis[nx][ny] += vis[cur.first][cur.second]+1;
}
}
cout << vis[n-1][m-1];
}
'개발 > 알고리즘' 카테고리의 다른 글
백준 7576 (골드 5) BFS (1) | 2024.04.21 |
---|---|
백준 1303 (실버 1) BFS (0) | 2024.04.21 |
2024-04-20 앳코더 (A,B,C) (0) | 2024.04.21 |
백준-6189 (골드 5) 옥상 정원 꾸미기 STACK (2) | 2024.04.18 |
백준-1926 (실버-1) BFS (1) | 2024.04.18 |