본문 바로가기

백준

백준14940 - 쉬운 최단거리

https://www.acmicpc.net/problem/14940

 

14940번: 쉬운 최단거리

지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2≤n≤1000, 2≤m≤1000) 다음 n개의 줄에 m개의 숫자가 주어진다. 0은 갈 수 없는 땅이고 1은 갈 수 있는 땅, 2는 목표지점이다. 입력에서 2는 단 한개이다.

www.acmicpc.net

다익스트라를 이용한 문제다. 벽인 경우는 0을 출력하고 갈 수 있는 곳이지만 도달할 수 없는 경우는 -1을 출력한다. 그 외의 다른 구역은 출발점에서 도달 가능한 최소비용을 출력한다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <queue>
#define MAX 1001
using namespace std;

int n, m; //좌표 크기 n X m
int x, y; //출발점 (x, y)
int mat[MAX][MAX]; //좌표 정보
int d[MAX][MAX]; //다익스트라 결과를 저장할 공간

//상하좌우
int dx[] = { 1,-1,0,0 };
int dy[] = { 0,0,1,-1 };

void dijkstra(int x, int y) {
	queue<pair<int, int>> q;
	q.push(pair<int, int>(x, y));
	d[x][y] = 0;

	while (!q.empty()) {
		//큐에 첫번째 원소 추출하고 삭제
		x = q.front().first;
		y = q.front().second;
		q.pop();

		for (int i = 0; i < 4; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];

			if (1 <= nx && nx <= n && 1 <= ny && ny <= m) { //유효범위이면	
				if (mat[nx][ny] == 1 && d[nx][ny] > d[x][y] + 1) { //빈 공간이고 전에 있던 비용보다 갱신할 비용이 더 작으면
					q.push(pair<int, int>(nx, ny)); //큐에 다음에 이동할 공간을 넣어주고
					d[nx][ny] = d[x][y] + 1; //비용을 갱신
				}
			}
		}
	}
}

int main() {
	scanf("%d %d", &n, &m);

	//다익스트라를 수행하기 전 모든 공간을 987654321로 세팅
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			d[i][j] = 987654321;
		}
	}

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			scanf("%d", &mat[i][j]);
			if (mat[i][j] == 2) { //출발점이면 위치를 기억
				x = i;
				y = j;
			}
		}
	}

	dijkstra(x, y);

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (mat[i][j] == 0) { //벽이면
				printf("0 "); //0출력
			}
			else if (mat[i][j] == 1 && d[i][j] == 987654321) { //빈 공간이고 갈 수 없는 공간이면
				printf("-1 "); //-1출력
			}
			else { //그 외의 공간이면
				printf("%d ", d[i][j]); //최소 비용을 출력
			}
		}
		printf("\n");
	}
}

'백준' 카테고리의 다른 글

백준2075 - N번째 큰 수  (0) 2020.03.21
백준16594 - 움직이는 미로 탈출  (0) 2020.03.19
백준16509 - 장군  (0) 2020.03.16
백준14442 - 벽 부수고 이동하기 2  (0) 2020.03.14
백준1600 - 말이 되고픈 원숭이  (0) 2020.03.13