[BOJ/C++] 2178 미로 탐색

GamzaTori·2024년 7월 2일

Algorithm

목록 보기
31/133

2차원 좌표계인 미로를 탐색하는 문제입니다.

상, 하, 좌, 우를 기준으로 탐색할 수 있습니다.

DFS보다 BFS가 적합한 이유는 해당 깊이에서 갈 수 있는 노드 탐색을 마친 후 다음 깊이로 넘어가기 때문입니다.

갈 수 있는 노드를 깊이로 업데이트 하면서 탐색하여 해결할 수 있습니다.

첫번째 탐색

두번째 탐색

세번째 탐색

네번째 탐색

// boj s1 2178
// 미로 탐색

// 큐에 삽입할 때 방문 체크를 해주어야 현재 큐에 들어있는 다른 노드에서 중복 체크를 하지 않는다

#include <iostream>
#include <queue>

using namespace std;

static int dx[] = { 0, 0, -1, 1 };
static int dy[] = { -1, 1, 0, 0 };

static int N, M;
static vector<vector<int>> v;
static vector<vector<bool>> visited;

void BFS(int x, int y);

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N >> M;
	
	v.resize(N , vector<int>(M));
	visited = vector<vector<bool>>(N, vector<bool>(M, false));

	for (int i = 0; i < N; i++)
	{
		string input;
		cin >> input;
		for (int j = 0; j < M; j++)
		{
			v[i][j] = input[j]-'0';
		}
	}

	BFS(0, 0);
	cout << v[N - 1][M - 1];

	return 0;
}


void BFS(int x, int y)
{
	queue<pair<int, int>> q;
	q.push({y,x});
	visited[y][x] = true;

	while(!q.empty())
	{
		int curY = q.front().first;
		int curX = q.front().second;
		q.pop();

		for(int k=0; k<4; k++)
		{
			int i = curY + dy[k];
			int j = curX + dx[k];

			if (i >= 0 && j >= 0 && i < N && j < M)     // 좌표 유효성 검사
			{
				if(v[i][j]!=0 && !visited[i][j])        // 비방문 노드 및 갈 수 있는 노드 검사 
				{
					q.push({i,j});
					v[i][j] = v[curY][curX] + 1;
                    // 여기서 방문체크를 하지 않으면 큐에 들어있는 다른 노드에서 중복 방문을 하게된다
					visited[i][j] = true;
				}
			}
		}
	}
}
profile
게임 개발 공부중입니다.

0개의 댓글