https://www.acmicpc.net/problem/2178
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
풀이
연결된 점을 찾아가는 문제이다. (N,M). 이런문제는 알고리즘 분류에도 나와있지만, 너비 우선탐색으로 풀 수있다.
너비우선 탐색은 보통 큐 (queue)를 이용하여 구현한다.
큐에 관해 포스팅 되어있으니 참고하길 바란다.
https://hyun-jun5.tistory.com/m/57
[Algorithm] C++ Queue (큐) 클래스 구현
큐 ( Queue ) FIFO(First In First Out) - 선입선출 이라고 불린다. 삽입연산을 Push라고 하고, 삭제연산을 Pop이라 한다. 보통 BFS (너비 우선 탐색)에 쓰인다. 나중에 집어넣은 원소가 먼저나오는 스택 (Stack)
hyun-jun5.tistory.com
비슷한 백준 문제로는, DFS와 BFS 문제가 있다.
https://hyun-jun5.tistory.com/m/56
[백준 / BOJ] C++ 1260 DFS와 BFS
https://www.acmicpc.net/problem/1260 1260번: DFS와 BFS 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는
hyun-jun5.tistory.com
일단 이동하기 위해 입력한 문자열 값의 index에 1이 들어있어야만 이동하여야하고, 해당 index에서 상, 하, 좌, 우 로만
이동을 하여야한다. 이 점을 유의하여, 문제를 풀면된다.
항상 (1,1)의 위치에서 시작을 하여야하기에, 출발 위치를 기준으로 큐에 넣어주고, 그 위치를 변수에 저장한 후
저장된 문자열의 index를 하나씩 탐색하여 문제를 푼다.
Code
#include <iostream>
#include <queue>
#include <string>
using namespace std;
int N, M;
string maze[100];
int _search[100][100];
int _isVisit[100][100];
int BFS(int X, int Y)
{
queue<pair<int, int>> q;
int move[4][2] = { {0,1},{0,-1}, {1,0}, {-1,0} };
// 시작점 입력
q.push({ 1, 1 });
while (!q.empty())
{
X = q.front().first;
Y = q.front().second;
q.pop();
// 4방향 탐색
for (int i = 0; i < 4; i++)
{
int SearchX = X + move[i][0];
int SearchY = Y + move[i][1];
if (SearchX < 101 && SearchY < 101 && _search[SearchX][SearchY] && !_isVisit[SearchX][SearchY])
{
q.push({ SearchX,SearchY });
_isVisit[SearchX][SearchY] = _isVisit[X][Y] + 1;
}
}
}
return _isVisit[N][M];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> M;
for (int i = 0; i < N; i++)
{
cin >> maze[i];
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
if (maze[i][j] == '1')
// 1,1에서 시작하기에, 좌표에 + 1을 시켜준다.
_search[i + 1][j + 1] = 1;
}
}
//처음 방문 좌표 1,1은 탐색한거로 간주
_isVisit[1][1] = 1;
cout << BFS(1, 1) << "\n";
}
'💻 OnlineJudge > Baekjoon' 카테고리의 다른 글
[백준 / BOJ] C++ 17610 양팔저울 (0) | 2022.10.19 |
---|---|
[백준 / BOJ] C++ 1697 숨바꼭질 (0) | 2022.10.17 |
[백준 / BOJ] C++ 1260 DFS와 BFS (0) | 2022.10.14 |
[백준 / BOJ] C++ 11000 강의실 배정 (0) | 2022.10.13 |
[백준 / BOJ] C++ 2075 N번째 큰 수 (0) | 2022.10.12 |