[백준] 14940 쉬운 최단거리 / BFS (C++)

sobokii·2023년 10월 31일
0

문제풀이

목록 보기
37/52

문제
지도가 주어지면 모든 지점에 대해서 목표지점까지의 거리를 구하여라.

문제를 쉽게 만들기 위해 오직 가로와 세로로만 움직일 수 있다고 하자.

입력
지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000)

다음 n개의 줄에 m개의 숫자가 주어진다. 0은 갈 수 없는 땅이고 1은 갈 수 있는 땅, 2는 목표지점이다. 입력에서 2는 단 한개이다.

출력
각 지점에서 목표지점까지의 거리를 출력한다. 원래 갈 수 없는 땅인 위치는 0을 출력하고, 원래 갈 수 있는 땅인 부분 중에서 도달할 수 없는 위치는 -1을 출력한다.

무난한 BFS 문제이다.

#include <iostream>
#include <queue>
using namespace std;

int map[1001][1001];
int dist[1001][1001];
int n, m;
int goalX, goalY;
int dx[4] = { 0, 0, -1, 1 };
int dy[4] = { 1, -1, 0, 0 };

void BFS(int x, int y)
{
	queue<pair<int, int>> q;
	q.push(make_pair(x, y));

	while (!q.empty())
	{
		int tmpX = q.front().first;
		int tmpY = q.front().second;
		q.pop();

		for (int i = 0; i < 4; i++)
		{
			int xx = tmpX + dx[i];
			int yy = tmpY + dy[i];

			if (xx >= 1 && xx <= n && yy >= 1 && yy <= m && map[xx][yy] < 100 && map[xx][yy] == 1)
			{
				q.push(make_pair(xx, yy));
				map[xx][yy] = 100;
				dist[xx][yy] = dist[tmpX][tmpY] + 1;
			}
		}	
	}	
}


int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);


	cin >> n >> m;


	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			cin >> map[i][j];
			if (map[i][j] == 2)
			{
				goalX = i;
				goalY = j;
			}
		}
	}
	// dist 초기화
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			dist[i][j] = -1;
		}
	}

	map[goalX][goalY] = 100; // 방문 표시
	dist[goalX][goalY] = 0;
	BFS(goalX, goalY);

	// 원래 못가는 곳 체크 - 처음에 dist를 -1 로 초기화해두었기 때문에 다시 채워준다.
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			if (map[i][j] == 0)
			{
				dist[i][j] = 0;
			}
		}
	}

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			cout << dist[i][j] << " ";
		}
		cout << "\n";
	}

	return 0;
}
profile
직장 구하고 있습니다.

0개의 댓글