-
백준 14940번 : 쉬운 최단거리(C++ 언어)c c++ 언어 공부 2023. 6. 7. 23:21
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
Code:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283#include <iostream>#include <vector>#include <queue>using namespace std;int n, m;int cnt_count = 0;int arr[1001][1001];int dx[] = { -1,1,0,0 };int dy[] = { 0,0,-1,1 };int cnt = 0;int check[1001][1001] = { 0, };int visit[1001][1001] = { 0, };queue<pair<int, int>>q;void bfs(void){while (!q.empty()){int x = q.front().first;int y = q.front().second;q.pop();for (int k = 0; k < 4; k++){int x_ = x + dx[k];int y_ = y + dy[k];if (x_ >= 0 && x_ < n && y_ >= 0 && y_ < m && arr[x_][y_] == 1 && visit[x_][y_] == 0){check[x_][y_] = check[x][y] + 1;visit[x_][y_] = 1;q.push({ x_,y_ });}}}}int main(){scanf("%d %d", &n, &m);int x=0, y=0;for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){scanf("%d", &arr[i][j]);}}for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (arr[i][j] == 2){q.push({ i,j });visit[i][j] = 1;x = i, y = j;break;}}}bfs();for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (arr[i][j]==1&&visit[i][j] == 0){check[i][j] = -1;}}}for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){printf("%d ", check[i][j]);}printf("\n");}}cs 문제풀이:
BFS를 이용해서 문제를 해결하였다. arr배열의 값이 2인점을 찾아서 그 점을 기준으로 BFS를 실행시켰다. 실행시킨 후 방문하지 않았고, arr값이 1인 부분을 -1로 바꾸어야 한다. if (arr[i][j]==1&&visit[i][j] == 0)를 이용해서 값이 1이면서 방문하지 않을 곳을 체크하여 -1로 값을 바꾸었다.
'c c++ 언어 공부' 카테고리의 다른 글
백준 21736번 : 헌내기는 친구가 필요해 (C 언어) (2) 2023.06.10 백준 2193번 : 이친수 (C 언어) (0) 2023.06.07 백준 10825번 : 국영수 (C 언어) (0) 2023.06.07 백준 11004번 : k번째 수 (C 언어) (0) 2023.06.06 백준 2210번 : 숫자판 점프 (C 언어) (0) 2023.06.05