백준 14940 : 쉬운 최단거리
난이도 : 실버 1
시간 : 25분 소요
문제
https://www.acmicpc.net/problem/14940
14940번: 쉬운 최단거리
지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000) 다음 n개의 줄에 m개의 숫자가 주어진다. 0은 갈 수 없는 땅이고 1은 갈 수 있는 땅, 2는 목표지점이
www.acmicpc.net

풀이 과정
이 문제는 특정 정점으로부터의 거리를 구하면 되는 문제이다.
따라서 특정 정점의 이웃부터 모두 검사하는 넓이 우선 탐색이 필요한 문제이다.
또한, 각각의 정점마다 상하좌우로 4번을 검사해야 하기 때문에 ud[4] 배열과 lr[4] 배열을 사용하였다.
특정 정점으로부터 각각의 정점의 거리를 저장하기 위해 result 라는 2차원 배열을 새로 만들었다.
2차원 배열을 큐에 넣고 빼기를 쉽게 하기 위해 pair 자료형을 사용하였다.
최종 코드
#include <iostream>
#include <queue>
#define MAX 1001
using namespace::std;
int n,m;
int board[MAX][MAX];
int result[MAX][MAX];
int visited[MAX][MAX];
int a,b;
int ud[4] = {1,-1 ,0 ,0};
int lr[4] = {0 ,0 ,1 ,-1};
void bfs(int x, int y){
queue<pair<int, int>> q;
pair<int, int> p;
visited[x][y] = 1;
result[x][y] = 0;
board[x][y] = 0;
p = {x,y};
q.push(p);
while(!q.empty()){
int t1 = q.front().first;
int t2 = q.front().second;
q.pop();
for(int i=0; i<4; i++){
int nx = t1+ud[i];
int ny = t2+lr[i];
if(nx >= 1 && nx <= n && ny >= 1 && ny <= m) {
if(visited[nx][ny] == 0 && board[nx][ny] != 0){ // 방문 x
visited[nx][ny] = 1;
result[nx][ny] = 1 + result[t1][t2];
pair<int, int> tmp;
tmp = {t1+ud[i], t2+lr[i]};
q.push(tmp);
}
}
}
}
}
int main(){
scanf("%d %d", &n, &m);
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
scanf("%d", &board[i][j]);
if(board[i][j] == 2){
a = i;
b = j;
}
}
}
bfs(a,b);
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
if(visited[i][j] == 0 && board[i][j] != 0){
printf("-1 ");
}else{
printf("%d ", result[i][j]);
}
}
printf("\n");
}
}

'PS' 카테고리의 다른 글
[C++] 백준 1697 - 숨바꼭질 (0) | 2023.02.28 |
---|---|
[C++] 백준 1012 - 유기농 배추 (0) | 2023.02.28 |
[C++] 백준 1260 - DFS와 BFS (0) | 2023.02.28 |
[C++] 백준 1541 - 잃어버린 괄호 (0) | 2023.02.24 |
[C++] 백준 2565 - 전깃줄 (0) | 2023.02.24 |
댓글