🙇‍♀️미로의 최단거리 통로(BFS 활용)

7*7 격자판 미로를 탈출하는 최단경로의 경로수를 출력하는 프로그램을 작성하세요.

경로수는 출발점에서 도착점까지 가는데 이동한 횟수를 의미한다.

출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. 격자판의 1은 벽이고, 0은 도로이다.

격자판의 움직임은 상하좌우로만 움직인다.

미로가 다음과 같다면

maze

위와 같은 경로가 최단 경로이며 경로수는 12이다.

▣ 입력설명
첫 번째 줄부터 7*7 격자의 정보가 주어집니다.


▣ 출력설명
첫 번째 줄에 최단으로 움직인 칸의 수를 출력한다. 도착할 수 없으면 -1를 출력한다.

▣ 입력예제 1 
0 0 0 0 0 0 0
0 1 1 1 1 1 0
0 0 0 1 0 0 0
1 1 0 1 0 1 1
1 1 0 1 0 0 0
1 0 0 0 1 0 0
1 0 1 0 0 0 0

▣ 출력예제 1
12

🚀풀이

어느 지점에 도착할 때 누구로부터 왔는지 계속 정보를 누적한다.

처음으로 도착지점으로 왔을 때, 누구로부터왔는지 추적하면 최단 경로를 알 수 있다.

int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
void BFS(pair<int, int> here)
{
	queue<pair<int, int>> pq;
	pq.push(here);
    // 처음위치의 부모는 자기자신
	parent[here.first][here.second] = here;
	discovered[here.first][here.second] = 1;

	while (pq.empty() == false)
	{
		pair<int, int> here = pq.front();
		pq.pop();

		if (here.first == 7 && here.second == 7)
		{
            // 경로 추적하기
			while (parent[here.first][here.second] != here)
			{
				here = parent[here.first][here.second];
				cnt++;
			}
			return;
		}

		for (int i = 0; i < 4; ++i)
		{
			int ny = here.first + dy[i];
			int nx = here.second + dx[i];

			if (ny < 1 || nx < 1 || ny > 7 || nx > 7)
				continue;
			if (board[ny][nx] == 1)
				continue;
			if (discovered[ny][nx] == 1)
				continue;

			pq.push({ ny, nx });
			discovered[ny][nx] = 1;
            // 경로 등록
			parent[ny][nx] = here;
		}
	}
}

🚀전체 코드

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

int board[8][8];
int discovered[8][8];
pair<int, int> parent[8][8];
int cnt = 0;
void setting()
{
	for (int y = 1; y <= 7; ++y)
	{
		for (int x = 1; x <= 7; ++x)
		{
			cin >> board[y][x];
		}
	}
}

int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
void BFS(pair<int, int> here)
{
	queue<pair<int, int>> pq;
	pq.push(here);
	parent[here.first][here.second] = here;
	discovered[here.first][here.second] = 1;

	while (pq.empty() == false)
	{
		pair<int, int> here = pq.front();
		pq.pop();
		//cout << here.first << " " << here.second << endl;

		if (here.first == 7 && here.second == 7)
		{
			while (parent[here.first][here.second] != here)
			{
				here = parent[here.first][here.second];
				cnt++;
			}
			//cout << "도착" << endl;
			return;
		}

		for (int i = 0; i < 4; ++i)
		{
			int ny = here.first + dy[i];
			int nx = here.second + dx[i];

			if (ny < 1 || nx < 1 || ny > 7 || nx > 7)
				continue;
			if (board[ny][nx] == 1)
				continue;
			if (discovered[ny][nx] == 1)
				continue;

			pq.push({ ny, nx });
			discovered[ny][nx] = 1;
			parent[ny][nx] = here;
		}
	}
}

void solve()
{
	setting();

	BFS({ 1, 1 });

	cout << cnt;
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	//freopen("input.txt", "rt", stdin);

	solve();

	return 0;
}